{"_id":"@atomist/org-visualizer","_rev":"1134-290930dfe0ea194fe200fc1c1cecf205","name":"@atomist/org-visualizer","dist-tags":{"branch-master":"1.0.0-master.20191021162016","latest":"0.1.28","branch-proj-page":"0.1.4-proj-page.20190518174329","branch-up-master":"0.1.4-up-master.20190527012117","next":"1.0.0-master.20191021162016","branch-trees":"0.1.20-trees.20190714102208","branch-branch-heads":"0.1.21-branch-heads.20190720000338","branch-hover":"0.1.22-hover.20190726220021","branch-slim-190730":"0.1.22-slim-190730.20190731064839","branch-multi":"0.1.29-multi.20190812085505","branch-org-visualizer":"1.0.0-org-visualizer.20190822194108","branch-jess-tsAspect":"0.1.29-jess-tsAspect.20190822201156","branch-add-node-engine-aspect":"0.1.29-add-node-engine-aspect.20190826205831","branch-rj-manual-tag":"1.0.0-rj-manual-tag.20190827004235","branch-python2or3":"1.0.0-python2or3.20190906055855"},"versions":{"0.1.1-master.20190507010025":{"name":"@atomist/org-visualizer","version":"0.1.1-master.20190507010025","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"419a190c1f3282b2a22423f04b1998e1912bd511","_id":"@atomist/org-visualizer@0.1.1-master.20190507010025","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-eTUgqc2gUG9KTJYxbQOAXBzAJGDnkrVwzNMomatH2pBpXv1Etm6/reIxfF0D8jPSFV4LUtNF62RHCQJPyL4vgA==","shasum":"504ad43f887917cd95d832a329f65ab12ae5af30","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.1-master.20190507010025.tgz","fileCount":76,"unpackedSize":648631,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0NkuCRA9TVsSAnZWagAAi90P/i8gWirgv9thBg5MAGmq\nOoyX593yrYV4PlzVKPT3ILd1SGkk01QkboG4epMegQoeD1pfDe0lyCcaumNx\njMq3sjU/aqhbfH7Q8hFbKxsqcQB+oSgIdrmfTtEP2XvKdMklFkuicYrcbsBt\nWzb1Iftdls37pqefvcLmrvUIDLddxaEmvbaHEWIWi/EDdQWQ+dydhY3F5sdQ\nCJTe9IxkE6DzoAHbDTehdkfTi+bOaRXaW7fa3IrvAxsgYt0Oo8rHCIT62Zcf\n8P+3U35TP//I44ah5olZTFMV2c04WPObR4uLoApId0ozwuKz/I0eB5TUCCfu\nOKB+uI/IlAn1R8xenl/JbXzO4EKkLL7n7k7kWLUDmXf8GghGmuONHvPTJNf5\niDr5RfJ4H3V+JOAG0p5lG0nAL4ARTgt/cBZuvsfncoFguf0dEpguRbLhctL3\nWqy6Km/Uwc5f1tixJ45dZ0nGD5oYOP07PQNiEOSs8osQjK85IG2ZcKUsAmxr\nLLGgMX/E4DxxcLZKwfG3mjNzzonQce0B2ioIr6HscfDD0dwVFFSaIB1Eay/Z\nI7WdG8sYZjLAY9HKmuU+e/qtBOgSoOzhRnz1D2B+YGmmuRW9dvnk+mcTowsi\nDlpZzM6AmBaguJj98Hb6GY8HiBKBGV0R0dVoyNhG0DqGyygXO39fqcizfmgv\nR0tE\r\n=rB75\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEzcmYtmq/zmnm+SuYn9YvhHRIj0fSVXXhgV7yQ+QYj7AiB40G5LOK6B77FDe7evJN+43wCeFwncELxm7R9yMTx3sA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.1-master.20190507010025_1557190957888_0.8733172302267391"},"_hasShrinkwrap":false},"0.1.1-master.20190507011759":{"name":"@atomist/org-visualizer","version":"0.1.1-master.20190507011759","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. Extensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2716963a54f9f6c6e0441f9bc47e6dc8f2b418cd","_id":"@atomist/org-visualizer@0.1.1-master.20190507011759","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-6k0r6ZqlTiaMz3TRpCQz69bhdkb6/4FCR3thAPRthCAR2U5vtk7fAfOXOJx/7PGfVtQSu6SC5o9GF945W/SrDA==","shasum":"1ff394cb704154dc7c53fbfd6d92cf8e9efe02a2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.1-master.20190507011759.tgz","fileCount":76,"unpackedSize":648631,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0N0nCRA9TVsSAnZWagAA1TMP/1saJ6GMIdqh7m3o1vRC\nJHFEIUBGqIEoElVHbBl7NS0oA//mNV3BzGpVACvVJY+8/h07jc3wVoZ0e/Tg\nFUYbPttyMU1BInows1ywdTvmmkrOOy7ghoEc6qgPr715OQca6Un4BnMoHcZY\nJCHYX9d/zRDvXXFFTPH4/WI2WXQ32psrTEsmNs80IQUJCOlJM2v31PnTshyr\nNrQovPwA75/07s6wfJB+7Q4h0yaRDL3ILmHUPTK5Es1q+sx49Yau2kc+17ph\nyMKqIpF/Mi9VR90bx+rlEyGIHj3umnyu3NXw1PVvJ3CLu8XUdCh9Y/L1ffBA\nFXpT1AsySJSQDhTzStNRsaxZsqrQT19qbAUH2dNGgFMCcj2+vYRBlmWVrGNN\ngtKcJU6H+hZXXPhvYA5N1GRvTgV7l9/BqdxFpFa2UHtCwoEmceh+6SBvgMnw\nKJdnO6V1tavpo1dACBoHvZI0yfnqYESB9rkzVfgjQtzyoMtSHLH+vsdmzVp3\nES3R/zzfY26ZUPCt3Uol94arz9AfluR/f5Pz0KQ+SldRngBXOrHKpDxoftlJ\ntVEC8oRouWEWBZlI8gHR+wzIW7xRID566qsb/ER8Oqag2V7adUm2HXpIzYox\n7Dd/S5Vrd2saa2Z8UjPgEXujkWOjZahfjitGVWo4bcwBq+6H6OcnxbdOaAyd\nANOF\r\n=izUr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5xwe117AEjFoy9kDOhnOe0mBFxOuPKKxDjqvI4E35kwIgUrOUPp3L+BXv/xm9znOznDa3M3pyCi5qH/GdJx+Rqko="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.1-master.20190507011759_1557191974564_0.24546976696302547"},"_hasShrinkwrap":false},"0.1.1":{"name":"@atomist/org-visualizer","version":"0.1.1","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"6e96a3bc6db382884bd5583302bfc033061d0680","_id":"@atomist/org-visualizer@0.1.1","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-p2FBxtt1Ki4Sq+0EcPQygpy5i/Vc8r4mi38QC7ZSXsGAUWohztEnhbF3HyMF1ggkfhX1GbbUrmRkPon/+OF/gA==","shasum":"464f6f2b6dc803018fb8bde2d393cfa77db96e56","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.1.tgz","fileCount":76,"unpackedSize":648609,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0N7YCRA9TVsSAnZWagAA0HYP/R6MBsZ30LXmaRYN1dYw\ndvlmUyORakMkyJk5/xst2xagoD3gwN6gWsS1XZUSmrWRCXW5yirvWXqlaspQ\nOv4vk4nApGBkTl+DSSb/GFo1zUQaBdiJHp0Ld37lQMKLYUpSYX6+4rTHmAFR\nMomBqZEYatnY39xybxVN9LalgRJYsxIijJs6JZCgrk+I2n8IryT9R0C50LU0\nO3uUJOtEpaEhPiPv+YFJJluULYOGCn/bFcilcy8zQFFbKLDOEfrDErizTVax\nexlRyBf+TsM7bNV/B4qY91w1IsI52egjlrQrzkPNEghdBwj4+ZS15hA6bZaO\nJAGAC+oAHWMKlvyiKFWGnYhhVjyjcYMBkggtPxYswrFo3heGvkDiPvvagIsL\nZhM0tybM8eZUTKF9bVOZVdBAGtQ1mZZrieRHYh3Qf6uQCmGx/hGjpmXMsBRl\n/5bsXfwDR8Beop8sx0c4vQ8dyFlemhCY7rOUwvKjOxsqpfFDXWS0b8Wiwp2n\npWCozUWhfok6BuuRvy7CCPVurBWGj7mvG7s+bMNN2os1gRYTRd/cu93bXhS/\nhVmaxP7BkicEDm6WwzBfRFTuhKF9gDzZ0xFeOukaycwHy31sG0EtkDl1TSz8\nvXFfHqsgw+LHwsflzA4H6VH3hZM5BZdZabGVcoGtemw95du/FQS0VvROIFrd\nM+Qw\r\n=ohdw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDoWGy8dYVH6msU9tzLag7pOcP4m/S0cupK8zA1UPYglAIgSb6xrZ+/UHNUj1wE3HN1/TdSrY7lWTroQRhc3Tx5mIA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.1_1557192407723_0.07688128082149892"},"_hasShrinkwrap":false},"0.1.2-master.20190507013759":{"name":"@atomist/org-visualizer","version":"0.1.2-master.20190507013759","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. Extensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5cfe4cb5bcae562a22f75ef11a291ce368a7a211","_id":"@atomist/org-visualizer@0.1.2-master.20190507013759","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-qEHza9LcmgB21NfDMicsfX1rUk49QAbxtseqmw8znPlZndzkrzJ0GcnNvF4SyvZ5Neheuc1ssl0gS2BKH/OMwA==","shasum":"c9134596c844f69dcc1eb7b0ec85b06fb6f51e3d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.2-master.20190507013759.tgz","fileCount":76,"unpackedSize":649080,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0OH+CRA9TVsSAnZWagAAYKYP/AiueSCGXxmB1ePqEFfE\nO+CJBMlk5KstNZA6EqUH2rTA1zJA1XhjiT351pssSnnOs17BzK+mms59aKIR\nB1Dmoe/I7VcD1m/i5bENt0BdNk7lfc17dNKfuf+QP4GdcVtmlHnX8/0eH54L\nGpkVzHSazOy9mShC1sAqYwC0t7ipOwM4iUonUkPYGQ3mCaM3hfS6HEu/4lIl\nDRjCZYf2fCKzDn536nv/Ju7BqT9SSikkiS5iRYQW5xa5yKyexeEVDzEQwrAp\nWiOMM4m0H6n8GcmV6Owe8TqzvwJmmnUlJLqv3EW+RSCLSaZRUA8eiP2w9cFh\nWTbuimns40bVomFP8bmplz8tI72bKtuNb5xse8pWCJtgi+KlYxFOkx3tqB10\n4GE0oNXNsjQHMLaxr+mvg7Icrm9H7ow4alcl4k3n2exRT94kKTTjzTwvCRn7\nQMFp5Cufa9rLFu5zrYGLOjxBURTLLOQt11W0rjOJMoeq6JZXE84n37ChE34F\nYFrk/3Dwy/ziDyLix79B+PMHT94LG60C99uGM55HfPhBrfcFGQA94lxqGQAF\n91XBr0/hnJ4zgz3aFWsnyCqVpbP3nlYu6NehH+JhukAt+z0tu4XQl8yOgdi0\nBNrhN52RXCkkImmKAs+Umi73uPwEMvEVenY5LW1RVd34prGcqBLxlrnFACO2\nox5c\r\n=rAbm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDXjQh8SeBCSYAmMzF4y+1a/Ws8Gr9+rh96zBOyZ0Bw7AIgS97FVX0w/DrtIcYvp0g3hUN935wG3TPKERDgGVvCPho="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.2-master.20190507013759_1557193214006_0.42730572298334146"},"_hasShrinkwrap":false},"0.1.2":{"name":"@atomist/org-visualizer","version":"0.1.2","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"c9073469adb2142b03eaa8f8bf2946b9e9e19a71","_id":"@atomist/org-visualizer@0.1.2","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Y/74EF0pAuvFYM/EtyLRWeBjM/MmuymV+RFBa/zVUpLGO/L7YTlKgwXZ3OFSpAjAo5V1LtYl/CHf6GkJPJgYIQ==","shasum":"79b9f17c1142779c5a167725282640c2345f35f2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.2.tgz","fileCount":76,"unpackedSize":649058,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0ONZCRA9TVsSAnZWagAAcWkP/j+zGnrSMeSqZWkkDzh0\nDdFXn/RKQLLYPbYZwv+hnbOU6kZA+IJITnsplNhnBUrCKW+Iw0sPYcgYt2fA\n00j4x9C7mZ7dmdmaClWbC89OQ2R3yovdBLUEZKBcQmhwIul3wgVFsKu9KhWI\neHezc2nv9dDK0QI9J8lfU9kqMKzgYrT98w9BaQDtaCQnXG1v7Wcl/HQaOFKF\ncWj3p+RCLQ/7lKFFOyenMNB4jRwUMAegs41vvCDUxt0XVERiSeZUxjxMwDpr\n+xLA0ysDWfaHJ/U/c+KpciYFQfW+0UdEWAlUcx+TsVSLKD12OOGagbBQXEw7\nAg3S62cdaWpGH7oS3nBZvVKtS0KFVfLWRnkzDkQyEBlX0hpHAPjlEtyA1u8Q\nfiHC6j4/LxlEGLU8iEKF6ywmrbw1mGDtINCfxL2RHLenQIbKXjqB+Eee4Typ\nvqpcWscy8rPWfyR4L6Ih+X772NP8QOa0HIMyPbI3wYXYXsoq7BvSr41fdwh7\nKW9s29ZSQC/gLdgZsSAWzchp3CFiNvq+cP4go+qLsAw83nFXNFPl3nnIJ9jh\nh7DvFeV4ms/4e1k+SMF75zYPPPBicR267afG1XoewMwvVkHj/8vy4+Ag23a3\ntm1mFje29L9KP8BQMN8l34zJBD8mRG3mDhBRICZ5SmwcMDk+Ep0sQtPHpk4/\nmJej\r\n=0byN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAQ0mP1vxOupXqUTiGt/lvrHDXBYFZBcSwXf/PssGQ3RAiEAsZfHtBPe4UEiBKFmkVdnDRlpb/tpdiZgMyBnXh12TpU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.2_1557193560168_0.686382182800195"},"_hasShrinkwrap":false},"0.1.3-master.20190507020634":{"name":"@atomist/org-visualizer","version":"0.1.3-master.20190507020634","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. Extensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b7c88c36317ec6f1ffc253c56e3a7d7067cfaa90","_id":"@atomist/org-visualizer@0.1.3-master.20190507020634","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-zeGYbKB6Pc2resjdT/yr0Gr/Iab/FJ3UJZ5CbUa30lRTSFvLXWLwCuV/c5UHHBeoNIkGyvAEXhJhZE5Uw/iWnA==","shasum":"5bb96946b53bece92097a8d15e041e23042152df","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.3-master.20190507020634.tgz","fileCount":76,"unpackedSize":649014,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0OiDCRA9TVsSAnZWagAA9gcP/A6/RpL0EaOYRgPtYfDt\nMrzxeyYa5VKaLa+hDy9UbQKfx8CpzUETZtZh2XhBcF9aVnqhPcjEShjidR1q\naIl9RYXKXXId5xgtGB2KYLrMLjnePHPBVcbReSJO2CUJQzsGqDJRP0Pl0tnr\nELorc/xVTS6u7M/l76dgFm01VsCvvP5GJk+WPDihNUnj5MYqbHy2tMLlRhrN\nCCqOuk6l/RwSffUYAVp6tvUlq8MyFjeCXovN8Gg0W6crrgQj+P0xewFr4S4v\nAiYMT0tyqWHtMR+Lyxtrjf6HRbdg+8JcD7uDtVuSLRmytXkiDxVy9xtdk2sI\n2u817sxUYoM0+HZI7lAFfDR74QeWwRyaYSk0PUhTW4d/MlXnsGxWGJJAwtL/\nu30c02OVARtj19RBCUdVVvxNlTsJu7q6pMhSP4vcKx0BQBDQDVKbbZd1ljlW\nG5VQL79SVq6k5limWeqd7UEAxSChbgZNN7US5GW1979U4KoXGekdsVmynu4F\n++CIfK0TS7fIdej/nxZ3B3u050JgUr7Kw3r9klDvXcPaZ0koThAf4ZIkmoSi\nw4GljlLdbMAcwrnbbg2ZahcTqAZKnZihevB13INaqKg+HNhk6JfnKkTZ02yH\nl7hNZGyVDVuSRQfe/inQRe74Tpz2fZ9dzUiRL0vUsT98zV4TeazaJDyEMFCD\n85EY\r\n=q8II\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDbh2dQDF0pZ8Mbb1ZqU+x57Hgcux31V7ANjGWJWzsRLwIhALeCbB770539w1LXfixTu9VmX1PTGQzTrxNM3xiI2e2v"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.3-master.20190507020634_1557194883206_0.6019168857382504"},"_hasShrinkwrap":false},"0.1.3":{"name":"@atomist/org-visualizer","version":"0.1.3","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"7073d502435331b2c0dedaae0833d8ab4e722df8","_id":"@atomist/org-visualizer@0.1.3","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-bc0XBw3T4WZbVXLIJTx72+reUa7OBcjEk39NmG8uaZrXTtO6xY9PUK6vu5g4Ds3dtDpWCfIdGXc3W3BcofCZhw==","shasum":"c38da16ef029e89f0840f18a806b95399866f9ef","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.3.tgz","fileCount":76,"unpackedSize":648992,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0OmqCRA9TVsSAnZWagAAIpIP/jSssxfFhVG2UWp0TlBy\nacu9oEBUlwxx+EzbybnZUV5zmLTXQqTsV4wCBNO+xelBDI/+cm7TXPzJxcLP\nHomJHe7oZW5mZ6tB/xi0Yy+A+JEXMeF0J1Tbi0L1eqhQ+uWpEwebZyMet7BS\n7aU3iFb7e3JZ/lQ4xMJDV4V7S6O6xN0HWEW55x4miP/5j2ptGqgJlEFuCs6U\nMmbIImy8HFpEuN3N+fDyuOzGoySC2dG81/OMnGnJAwj1TGnf+GEsyPGVi87w\nZ1AGqH4EQYm3ZHc9UZ6ZtAOXluGW/DMMSRMOnsVFrN9VZ+esCQeJYVR5VKuj\nRZbf0G+DLG18TcGM8SBPvv+TnpkNEMd6/lvxv/uG+G9Bawn3272Zlo9mC7Ey\nKgKXrNqpDr2DiZfv45xoye1DmT3L8DrL6rQtsWrg3eNkyJjGovhwTRyqvLL7\nab98gr95Ikc42W1Zmj82Aem+s6FqYftzRwvAsK6xmRF/1mXeS/mzdnZlYCCS\nqYChEvY75O85TOih463sgDM7Hd0KolerqlSRqPZBNDH7bchqp2kCrqkbnaOd\n3QoNdwFzQ2T3Uzr8rRk9sm+ewRmiqZ4nTHEbK5SbeMZaPTHseZ4E5isDaFNq\n6Li/M2XO29XOHzBici+pHmbEIP3zQKJwXm5AF8kGohueX5UJVXX4SORSLTBm\nhAx7\r\n=OC13\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDC6I6tQ4Lo5LuK1GnVOUHDWGD9jPE4H5xkXocLHyZCeQIhAKQcn/Qpsw8gsT47yVTn1pm+ukOnCAQgLRATvOsGUMd/"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.3_1557195178157_0.4505865537785396"},"_hasShrinkwrap":false},"0.1.4-master.20190507180331":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190507180331","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"68dcd584e3deb2d421cdc751a18c1bb4df9496e1","_id":"@atomist/org-visualizer@0.1.4-master.20190507180331","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-vJ4Cks3gSMz3qetdQFdFSAkWMX520d3fJOO3hOygKs8Zh/p9eJukZTN9U+8qBxMsRmVG48jO+rWyOMFgG9a1Rg==","shasum":"8869f76f0e6df397d4c30bb2e66ac7ad221a3063","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190507180331.tgz","fileCount":76,"unpackedSize":649697,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0cjXCRA9TVsSAnZWagAA558P/jz2Cal5MjwcJFrtRCnN\niKLOi6ylmRwkN4VNq6vP4AmorLRpr7pN+JJsYMoUx8poHo4yhsXpw6B5Vaxb\n/QHbEWGyXGzE1TIw1Dy7NfRbNofp8Q3pUlcqGO//yp9iULLWgfR0vMEznk8X\nFRUrX+LTsRCOjadpv5TYk+TgnAyRnOJUhtiS7FNBIzc3ab2izu9y/ko3jJ2a\nbdqevqG5a6i+WKTS85ed9jSDFoq9YvdyIpftE3foMnyHTle/sMZS4KTQLVHx\nRkVnXlK65FFMq8ciaNrUcO9phv1hOZGOryGQtE0PfpsNhQxFC6PuxvPG8h7L\nhFL5V17/Gv6ICCy02++B2y7I/GSrJ7mkFVxoEm0abRzzfkFcVPlod0u5nmh8\npiWQ8DAXV7XTJ15juz5CUMLeF5LuKV7/6WPZJf54RAqkGLbOwO/rF3SFyVnH\nsbH08fqP8EqhVWVSN7PGQTdiCg/Fi9B/R50VpC+bSXm1vaGfMn9cPOpZPHxn\nXkrYSWTMldfT+tCA47NTfucGP5aAC91IyKXaTNymf07l2ze8RDWY0fhYg+mJ\n8e/XnrN7O/ESnbh+ForcQAhxACzZow8frs5bP7Z+3SMborPVhQ7UGLZxG9M6\nDrBLyA2Z/UMcVFrEckE2BAjw0IxJFexnAlOUDOZ7/FsUVfKuTJNonq3W/Mgk\nnA+T\r\n=p7wv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAWvU8QAWUkjvksQAmYzCKTVfdg0KTaNZizfc1v6aBZfAiB1nQa/AOmGRhllbPtRGt0+uXEbURwXHy5pXbuCvZ/9fw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190507180331_1557252310953_0.9232787204753643"},"_hasShrinkwrap":false},"0.1.4-master.20190507215104":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190507215104","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"534501dfa07989be9d79cfe0c438c9af48c66d17","_id":"@atomist/org-visualizer@0.1.4-master.20190507215104","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-RRSyyQbOGaQrR+AncniY0PoWGuEAtiT42qVt7DLwhWGLpjxpNdL+dAAZCm1gUwIdcaDev7y7J8hDR1vsZnHCaQ==","shasum":"d43f1bee121f15b222af8c2995fff5e919fdc4b3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190507215104.tgz","fileCount":76,"unpackedSize":649964,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0f5GCRA9TVsSAnZWagAAHRsP/iYO658zXmD/VLA37rvK\nguAqWtARDEWLLjJ0BtyNErk2ze4kz2mgIzQ1ugE1YGraH3lKuUGs4OCXrHDG\nWOOM8Cq01xhgJ7drY0d4p5WMCNNy1IWQFoq8rIm3/qe87CkyFLpitnIkZV4E\nvRPw5CGj4pd3Zw0kWqxWyOqzWhQvpTFJc5l/ybOnvd9o63ybFeGrGcKtkpp1\nhO/R2DTBQv8dRceWs7jgMKgvWFKiWCUkQJj+Qey2A1ZpMCsDdOVEwZPMQ5Yi\n2rgVjwHZ/5094qDB2AjWzKi0XAuKqN4CYgj3tTbfLe6jXfcvnUvZYre6cpfr\nkafXcubWJMZ6c3uI70cI2XbRzZTIHwWz2vykMHvclD8Y+S9wyMdITFl+RB2l\nydSak2Q7yLM8NQ/qhdK2OVGla373V4nEa4Sr+gChkWTS1llSMygiJz+II1ag\nny02Y4xPgC9pZaDslseaWkIEWUnFs4AxE2OKPpEQLtKjWHkQlO526cAdTikP\nSCYeuvSoQecL0Hopja//BIRHvTQHqICwZWgAyLXQKrp3UyhGpp5XlolZ10Nd\npMAczDmasKDcp3N93k6dp+8WRipNgAQqwV0hbpNXreDDHwMBkTNozzelV5RD\nZogw7ocL0GPYOTHyjQrlvajTdrd9DBgasfBMX9LUI0I2C++MX0ceqmZH1VZp\n15DM\r\n=ljYg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgix2qWr+iR4gQKjEeUAmVVD5EFQ8OBHa9WsaveRCuzAIgGJZiL/RZ/qRs339VT3A6qYEQVu8VXYLOJ+N2etcw3hw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190507215104_1557265990084_0.7963063280908156"},"_hasShrinkwrap":false},"0.1.4-scatter.20190507224029":{"name":"@atomist/org-visualizer","version":"0.1.4-scatter.20190507224029","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a91551787d4aad383c633174b6e72f55d98ca6c3","_id":"@atomist/org-visualizer@0.1.4-scatter.20190507224029","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Yjl3haQz0AtgZ+4DpqRQiX7Uud+4XjS7pe4LqmLyPoruTB2yuL2C37sz3JmqVWbzNmmcNH6Ay7MTYADXDn1WEQ==","shasum":"07e9404e690494242b4f48ac6a2a7017542b1d12","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-scatter.20190507224029.tgz","fileCount":78,"unpackedSize":654999,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0gm5CRA9TVsSAnZWagAAU/8QAKGPzFDmcJLkHETBq4HG\nBH35KoXyloOf0lxmTW1yZnyyZKXO5kr3o+4OWCssEYztVUId/UOy+hW6GOEg\nEUoWlja5f3N+L8v6lskr7yGON5Pn3umKsHx44Xw6oxZb51NDYO8E6pxHHyM+\njKw15XuWbvz36Rupoa7Ao6JiKRX3/S1JnBclD7ox1PxCGlhapwrDbHwGohHZ\noc9ET7B7wxc0gfsjmxRs1+tmcJqmi7LflhcX9si1CPWu9mqsCOnquY2XzavO\ns7t7sps1HYksKEXrU6lgd2YO4uD3auimFoeTJwPkWt/ardFINEUAFr8K5gOE\nNoBR2nMCzRn3Bw76F8dmUjlL6C3dO4hC51//6ssYxc9EGEFlnaZTEtRFQj9L\nXSmNHkCaDjWBFxKbok9ZIzYkyghaAigCsxmSRZe6DS9wQa2/wtEdrbUsHxoB\nTbwzjqZxlBq/I+85oXPYckY9UsZaSsIAnvJxkkttE+wJ9omKYPi4X8ADoEoL\nCIIQLfJR3PpdLG2o5zRvHrbi9jxStu8vUNGqfXKLvKs9UaSnKy+GGuOm+ahl\nijGEEysduJPlQd0WUjfNrl1GRkFmXQKhqwk7lUkv34ABCGnSXrq4vw73dSCR\nw9tTtbu8oucN6dMSXlOsfiLxv9zGio7VJYqwsYtJLA4S2MiqOGV8+RmGmiaI\nlVsZ\r\n=UX5q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDqBF7FW4L3O569cwJTQ22o8Abk+V6zd3kR5Jfn2t6FigIhALtn76mpVSCyer40v8DugJWfWDaSL9p7JMjVBywoNGfX"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-scatter.20190507224029_1557268920364_0.15490513394448957"},"_hasShrinkwrap":false},"0.1.4-scatter.20190508003948":{"name":"@atomist/org-visualizer","version":"0.1.4-scatter.20190508003948","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a055264f90fbdcf238fb5399cd616d5c63b66435","_id":"@atomist/org-visualizer@0.1.4-scatter.20190508003948","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-UtEbrOea+vIykAiqBId7tw9XpVyRNpJKv+qaEyAmHPNf3lmOCgfu3XxGUpYg5u0B8OOBzTJLibAgvc3o/ZBu3w==","shasum":"0bf4cbb2fd129f7ed1dd81aaf52ce90e2757a2b6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-scatter.20190508003948.tgz","fileCount":78,"unpackedSize":654188,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0iW/CRA9TVsSAnZWagAAUp0QAJDDeik73Ixxi6YodvK8\nPrkRuHSW4v4kR3XvMKU42tMHPd+3KPXLA0I7oXUh9xSxrMje83BtlQCcLtqG\nPc+2m9Lsbb4mXc8WRauuaNKoD0ejYBJzvcV2BzcX4Mzs+wA29PYERrC0PDq0\no6j3/VfHa6e7NVVz3xP6NhzQaYw6teArKqeOOMJX2M8K0ISWuSawYV4IIzdO\nLdjAUEaSyPOYCChT5AkBqo+nkPMQVb9GpTuecF1erYXsveE5ywcImQBjVy0r\nHUu+NajCINNLQAS0ITjRDY9rnstm43/bpvlv2HhZOrbCZYtN+qcgkqjdVTJP\nNV48v5fGgxTB3UkwoedUkypTLubBaOrNMbwjA4F5Dmx7Z/DP12NfXic6rYHu\nKIWDIaKTgZ7uf3Nu2qiNSmcFrYoFvXjNR0Nl0shplfkiQM/yGBs7wvSbN5oR\njLiT0iGbZI/6JEwoeJ7cDnUlH80PSscYZcwNLurVh25NpScJ+4PsVoBLreVb\nAGOvoSgTeAVn+XWVCvYIj5RRB1eLgo1LntDbzmg8Cqlylt/Pz+BeRT8FAC+h\nwoYyTIkyshWTibySYtMmFdJI+JNaVSrfejvBhv2EbmxScSMv5HLz9CsKhuyz\nXrQrWUd9K9JygCKkH3qpyANAwSYbCmNgTO/172O1D4Egx0kA0CkQlvK9WGzI\nAcyt\r\n=+OxM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCK4c0C62p+uO0D7Y4VQ8F6ZGc12TONgMUesB2odn5eigIgL1iDt10DHo1CpjpchPixMLycs3vKGiqwK69Ikr5r/Uk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-scatter.20190508003948_1557276094468_0.3876165924649193"},"_hasShrinkwrap":false},"0.1.4-master.20190508180155":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190508180155","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"587bad9081afdf928a6e825c4a64df7cc37ee399","_id":"@atomist/org-visualizer@0.1.4-master.20190508180155","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-s1Nb3aAAvTv5U38KEvXDfV0P0TvCWM92eHZ0rwkET+3/hjPcYEt+SyOJI9Xb/ti4iRZwVHSWVNl3P2+rLIJAtw==","shasum":"8be7c3bc8d4445bc868ba631d797fb72693c1841","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190508180155.tgz","fileCount":76,"unpackedSize":651001,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc0xoVCRA9TVsSAnZWagAADa8QAIuGt8KKz4zhIiduATwE\nVHze1SNhh9tEeRucHuWyUXh665CIkR9z3jzF3bcLMhpkJZQb3JxftVPeXaqk\nHDAXpUs8vUtKm4e7pJaWfb2mRkRS64oWWDdLAo0FRh2fYWmL9v7GP/nppgIQ\n4V14wIHVroco8X8POkkL1+btAwnfw4ldEwkD2MtlCyySk+FcocUbyt80df70\nADah30F30Zki69XZZuCbMNYwdt03SyhWmCjygnKcauDNiM9ECU5M1zr38Ape\nvZTa4BWJU6xCFDXhFR4je3kcR7RXL1EA1kOEuCAMsLWu1j6SsZ2WMwlAEWEd\nUI6XMFZSwr3Zk0zr1rACBbInmY0LooAnlMpAP1pHq5CtFBIImvmVvpb5jsNw\nSXvW8zOy4Ywo8f0n05bv5IQjblByQhj8uIirzWA8JjS3VK16OF/bxfb0snmG\n7nEO7DanEn40fHDixfFqiXyqM6FcGHA2uzZ17WlsjnhaDLskK27g9Zo+IZR8\nj+Wf9JxZpgxcoBzmwDMG2e8AbZg4SojO9zXlmYyQJuXw8eccBxt/KayH3jEB\nw58P9Eje5A8onsUBIPeDPtTQ6yuB3BuOzsqmAM0+Gftv4cKGUmFLv+CZ3MZ6\nxeKLGrGWFcB6T7qjOMuae5EL6G2DSCCXUAswKY4T7lqYvvoLTmtIGJjm+gMs\n2Miy\r\n=t2N5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDA20E9cS1AEHUcbZpy8tj7GUpbX7UTlVktNuBJNUX+gAiBKMyJs04Q8sBy6G8xydKYPKbrjTtj81rlv5k0EXGJJjA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190508180155_1557338644541_0.42411233862407727"},"_hasShrinkwrap":false},"0.1.4-master.20190508233931":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190508233931","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1c5dba8067ef111df2fba862f2a1eced7451ebab","_id":"@atomist/org-visualizer@0.1.4-master.20190508233931","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-qkqoaAgfI00HzWi5eur2/A4HFd0GOvIOfMC6uqwGXYoYW3tiNpNcAOjwegrt3Yf52mqncwpPfw9gLnhDrf50DA==","shasum":"034fb31c3c6be5439f5d212d546d38e0a7948d3d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190508233931.tgz","fileCount":79,"unpackedSize":653907,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc02kbCRA9TVsSAnZWagAAui8QAKOt9kkVLx7LiNR0hYf2\nxXgebETE5t5AuBhdZeaaFGtRKUVAIhgaV8wHRqC5Bt2feQR51WpMJHvLGjhT\n2HAlYYdcC/puRG5QHJCUO2BouynKAtfA5mWPXkOnk+g0EEXBGmEFP+gpWrUB\ny9rFI1oGiw882/JHbk2su22244BasC5CjQQb5kjCWWeu6WEHkY3ZWMNsYFAs\nrjJTzBz5y+Yc4quVqk+yNbn4ebKQ4aLrtOzXo06Hirm49zHEHWOcu6W8dmTf\n2oSUP+ASqvs+F4oHF36FEbLzFhHgQ2Ja4Vdw4CRuN9txs8PbZZy1mND3xqbL\ncWPUG+f88sCWRmj7b9c1K21IRhVeWIuJfAvnQjvCLRhPemSjAqTlNpXxFtYx\nwj6KkIZve35mvSc470v3ZMQKATJ3SMGpX7oKaUgRkejE5+ajnL9l4WEEZ8zT\nuXGZwNsU6YQdKs0bKNU+iuXDk7LnQBqa05yZ0nNM+OFLYQzDJ/JCKutfxib/\n4M8hq9F3zr7ICa1mvhVCS8SejIqrgQ5fZjedvCniktjtQPa8smnP/9ixWdSm\nacBqt4ngxvJoIhcdDMAwgqMRLapOvGgOgPZbVysHBTIux851P8rL4MrNIc9J\nc27iCCcnYwj/YsLnPN6e1V7YSM/kEcWU1i4zJCUuDVOdLtgxZTde3HW7olBU\n1NZZ\r\n=OLM6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA4F/0XdrdpbiNVnDcU5wLDk9zS70cHtO7H9QcPJapTSAiEAgClbudcjF7lA9o1YDNiQykum9yHdDBkjFptaWxvDzko="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190508233931_1557358874258_0.3590570830426574"},"_hasShrinkwrap":false},"0.1.4-mono.20190511023532":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511023532","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6b916590bb3a4a4fbb9753fe6d862dfe26bfb3bf","_id":"@atomist/org-visualizer@0.1.4-mono.20190511023532","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-12hXVmN5qagE3L/sfvFKi8EBuDnTWsoUzwT3/bYQDJWDtBgwY4wfX21XgiM2miAWtx8jUJDCiNJokei4hkdANg==","shasum":"37fed85f69fa0ede92ed9704d04d58026b0e6680","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511023532.tgz","fileCount":85,"unpackedSize":664469,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc1jWeCRA9TVsSAnZWagAA/m0QAIrEfT5SxQkyNqHnxaLp\nXxq3cBqzaKeLZkdYewv+CVs0QxMjm/cDLW5iYV/wbyLT6I8Il9hiWUpFGaIM\n7H3baMj7us2269hCSff15EU7WhfdLhtlsq1sqOrXlEqu+yV0tEly8o57qnJ2\nkh2jpInBvRMxnJAGc/HyWl1hTxJaDNxIhre7BCSThQi20v6zf/cW9xO3zfIk\n1VvZ840IUnBZ3UA9tgAZXF3nnqPD9ynt6l7yi7DquY0Ad+DDYs/2Ztxp6OGA\nOcMek7uZHKBf95l1kkV2XXb7mACPtpLEc/bi7Xzfa+IgDcg48PTOxxX5mlbm\nhBu919RGHBHlmzLIegSaWsR49UQXamsa19vXcHJKg+l1lOhK3qb9jpk3IQ1w\n4MqfUhnGMx+RY2Z6xDD7NWFoAYAVqNkfglCPVzuWv3zoYdMNQCwBBO2ERXfd\nUE43iRYVkSVg7b0ixfFjtgZ5eC5c032FrGguI/ADW8juiCwFBa1zBjWAt8Ti\nU5qQi/JbZ6fDWGs7/9w2nGy9PGY2cl7/etPyIpCZfOnAlccjBoTFXmHcoR/A\nDxqQl7AcNhkC22k4EJwwSlPZjiUJaYtK1r23mFikv+z8GiPjTUWDA/qJEsSz\nhKM6rvRHU4ssti8h2OFSeKJWaEVagFnEMeWosO2z6T3Xi9gx4BaaLXqLuh2F\n/ath\r\n=Wh7s\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCwst9k564D6hMMmotwyRpBTBpMjQ7cutWIvOe0ou13HwIgC3JooxGiJwtP3IjPRkPMIWDDOm5hiybtbr8NjYU+sD8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511023532_1557542301662_0.8558040701231975"},"_hasShrinkwrap":false},"0.1.4-mono.20190511024018":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511024018","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"566b4c2543616e430db3716037e78f84f08a22a2","_id":"@atomist/org-visualizer@0.1.4-mono.20190511024018","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-twHjNpApJLMtk+fYcSwREryZnsNKHwTpiyQM6IVltiA+KPQfESK6GXdVvLj+TT+1LQcqa87M20kiTFXdVqyWMw==","shasum":"146af6a8735253ed66313aea6af4122821f507e5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511024018.tgz","fileCount":85,"unpackedSize":664363,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc1jZcCRA9TVsSAnZWagAA0ocP/2ETNGgme6y0aC0WexQC\nwEDifMWqIyvh2XNVi6UdzLa3DMm+r+9uoR6ae6iMNKN1/OGzbscz+mEhaZlS\nEy6TwTToAWQxXUc98HpwpJ3cDJ/dZUMjCeFEYtkLjr7C8kZxxjzRVJ4csWQC\nutX5kvxMTzAOIrCB+hUCrIUh9HjOgsO5PlitQQBWLSJIJAQv9V+Ml+0Ph/oK\nUSzSGPmSrG7Bl0MaUdyxfjsP01G1JNLFh8dJ5MvF/EVv4LRPnwI2+KNLAjFP\n3Vl8E2q4QzMAnIvYmrbViCQhW+q4RO07r3kiZNFAQbFptfhlWDeiQ2nciwV2\nozjHOGwaHYZGZXhVebXJoU7or+9bN9qvQW08cBwYsdDauuX6b+0tfe3r7+f5\nijn+bfL95FjGmaA/U6LvVjyPgw0ffIXtDr1nzCH+qge2+PJiZksjOwtIVG2b\n9V2JYeqxJnkIKI0q/1R7smen0/tBqZLaGa9O2oUaAk1m1eE8oRMcAPpw2uFw\nl451zRTkAQlYBVJTMvO82ueOugpx0iLDDat2ZVKAxgrPB9AhcpmpuPo60rL+\nN2FMFEF1qjrLaOFY7Je+nPZ3hWiFpFT5uK/8QxDv5BJ2V9dp41bYg6XnGyMo\nEF4k3xcQqYWOElx8sZUp0vyxH4EjTbiG3QZtqinzdP76wRaWlOk14pW1WNiU\nzkui\r\n=HHrh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAJ3voeaoKP7ltXNe+IKj3K83Mbg/g6TxYsp971aNz4LAiAS+aLUsMDbKrq71fCijz0S+ECL+sq+D0IWN+fExO7r8g=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511024018_1557542492047_0.37656094905971016"},"_hasShrinkwrap":false},"0.1.4-mono.20190511024903":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511024903","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"78477bc7f71e52b5c9153563c64d30c95b78895e","_id":"@atomist/org-visualizer@0.1.4-mono.20190511024903","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-KZ/Pddlle5Gy8tPCEHW6i/gGyzsltvYAmX1+DyV+iu9KzW9dkeoXWI3KmsW0i+cYtXQU8j9bdxU++RBmRDfmUw==","shasum":"47b14d0fd1e499d49edd3daee792f3c107fc6317","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511024903.tgz","fileCount":85,"unpackedSize":664280,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc1jhoCRA9TVsSAnZWagAAKmsP/R3F0UnSHV/HFSpfEjX6\nLPkwWBYAnz3mhxHwVzurlr0KMrvlgOFJVgtPf+N5k25uRLTfxO6KacS++tPH\nV0hCbeRt7PM9DGyjkXYTu+tyZWs3N00hUp7vwEluYuj1TBKnRYTQcZUDNJt+\n2bGNwrNM+Gjs+tQPTEL3VSNNizEdrEKClxW8RggMvb0Wqm6Xe0HPKd+LQZa0\nmIYHeTAv0rtKb73TMNReWrhd7AmAVBTdX2IUdjoXwqv7msmRHe9hliCBjhKB\ns/wLV5h+Pw+EOn+vavkbTYZv8gNflfAqkc0lJjubHUvYkCVPl7X4DFTVR0BC\nKQYYWJ87s9Cl/YKnh1fbftxuDoVERLFGcgciaBZ7pyEkopluMMlzogjksdNr\nM/3EAVBHoH/ja5TBIBKUwtGNVGWprrlrJeIOh9TfHuJ97TrHUsQ7GDzqgpzm\ndjoxKxmWLAK/LMfzHx2mTNvF5O9YDO6xvmT+krN8rgKCcM0ldO23CjkcYnTG\nUbRyMqZpVvCbchDy00QcqT+xZqu8GJ/5s6nwgS+i5EoX2LwwWnXLWzurwheu\ngKFVy+ErspOiXQvFRfjlC6DaIw9+dpUTgjMaOIdT0pWCrOa5vKMZYCrR4RpF\nHffxi3N+9fN/wJJnDIvjAjezXMlrgJsHd8fUf3DI7NReiREEP4dL7MFoqBCC\nflWE\r\n=AR3Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCFsamnkWCqYU7QXp/QVz7O9kXWH1Cn5uMee6D+z47i9gIgJuOp6mSYW0RQfkHSsr5q7rS1jpPql97w9L+TZkdQjBQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511024903_1557543015299_0.4323108957442099"},"_hasShrinkwrap":false},"0.1.4-mono.20190511214810":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511214810","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1e608f0e04bd4d7ea271334d7fc1907a1da97d6c","_id":"@atomist/org-visualizer@0.1.4-mono.20190511214810","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-AUzzL818HtAInsl6sC2nskuQVXZQlnA5T2UUPwdQJFP478S0mxJzw07EYEiuRFhSL00MPJNjJ5AUXt1hW48EjQ==","shasum":"48a615e99dbab1b942688f3d310d207f3a7239bc","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511214810.tgz","fileCount":85,"unpackedSize":668180,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc10OvCRA9TVsSAnZWagAAwboP+wTSryOh72Jl4YM9FmX6\nQvP+8lsCI6o+icDigQ8Ak9JDPW7tMziPrHOX89+FVLHFmGxPmbaD4Y11tQ9k\nhV7tGVJjmy2X8HYhJGP8H1Z5Mqv8+GaMvU77HAjVUTXofBoESxbDnryHWbK9\nd/+Rtw1Gv+SzHhvi3MyNc8jDfnfphHbSMfjw9Sb7GsiPnRzkQPkXUUl3ycxV\nz343zn7I4QfFRjaqDL28SKuqspw/OUJopV8m95OUIHlEEkJhL7YUUi6dCFfx\n8uUGsPEOElIRgj7IOxuVinQEanGJ+SLxGZdxnKZiBob2YymDukW2mc6uRt2D\n37pj9Mar/LEK0t/w5VWmiuSG8ZG2ZJ/BZtnQ/zySWeb1hX6Ws8UjuzdDdHxa\nob+XMsQ9BFr7F0fjgfWJYfKxKRzaVz3sWBLV/tC8jbPduiUkpKoqGe3Xi390\nr+HQ+pqLgTmW+5HL/sYJlo2JbF3WSQ+OWiNprgu825H5zZgGPGFXO0TkGUdE\nCEz8uWcyepzUIMGNlGxdx08xTBqGFV1GBt0VvEAMoGrf1iTHwLrUjvMSTtVV\nArGgEWQkBaVHcu6xGAyHDkPGNR2/Br27ng+H4zSeCRnDkLUCwWCUtQL2WCWX\nYLVqT4Vj3mRZJjNymbQ9ufytSkLP+RF+G//IYilUKBx7bdG7bY4RW8anqpkB\nbM1v\r\n=D1OA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDsnn3X9HgfsDc9teMqllNiCttpIXSetFEdNkqV4XaSTAiBTTUMFt8ZDYCHKfP+P1PYlgDBMmMKIiQm4lrG1ke9M2w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511214810_1557611437652_0.09886877245568182"},"_hasShrinkwrap":false},"0.1.4-mono.20190511221327":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511221327","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"48159cb676a5944f45b4a6f99ee825924dc6a4bd","_id":"@atomist/org-visualizer@0.1.4-mono.20190511221327","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-2kSQgqMxTUcmUvXYbTjoWMXEfu4o+GLT8Knb25m/tqc7V/DhFZqtYG5lWhD4DAWNxmf1ZqwsmT8llC+c5y3q6g==","shasum":"affcaa2fb3d36218482801b596f0862da18ccc86","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511221327.tgz","fileCount":85,"unpackedSize":669147,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc10laCRA9TVsSAnZWagAA1m0QAIrfG86CTH0aASJGE7/e\nII4eZ4kvH/OcZlLXXmcToViuXD3THf6sqn4fheaMf+IRr2Q0XzAFEF8IMsHI\nKKXA3qKm4qAi3j/kgaCMzMkUk5auqT7pyeT9I9HyHo0W9S2lhAG5j8HCcX8O\nwpTrkapWeF5Jh9QMDIpp6GLYs2iSWDpTzx+U6YdEmuKUsziH4L53oPtbrRFX\nufMr15xj6N8Xccg612vZ3WehSumKyYhWWEx8ut8j/TuIo7XV82kOdZmvO4AU\nO5dM1+yXcdQRvJh+l/+hbWLXg9Swl1p6CISWklBpndo8ZXYzM40kjfnVF5Mv\n2VZNUyrlM7g6QRB1XPDe2yOxSxPWS40V33oU764n4Z9kXdGrWZMLsaY+D9rk\ngbt1MgSPfb2AA/qTqkaM+oqOLv7u/0Gvb0wA51NN7rkcff9cTtHGY3yVYMBj\n/RHq6nrcjsmmXHpk9Tz0ilLLOsE8W9uS8pRXYvCUbc/5fr5uD998RT0PLmBe\nFz/KhJBmbaNEkECfBvFxy/Z+ykkv+FAb16CQOlYvqBOxfhI5O7mFm17UNZOI\njzpNXeFgXzA5xMKRrrUVqTJLFcVTDn8nIaTBS/0UO51h2NbYfYEO1RMArCpl\nM6uIyzw+qluIesUN7L47ZzbmoWacj9v6g5m47WehT/VpyS8MQfQDoU7E3z/S\nX2LO\r\n=lRMs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEPRfIBaUdBzqJ4gf31Mu4K+SmWKr+0uMb/faQh1eMFNAiBC28B3ej1BRu1AQKkp9JalKDo0NjP20jauZBBVlogLHw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511221327_1557612889447_0.1388400744659266"},"_hasShrinkwrap":false},"0.1.4-mono.20190511221529":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511221529","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"48159cb676a5944f45b4a6f99ee825924dc6a4bd","_id":"@atomist/org-visualizer@0.1.4-mono.20190511221529","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-cvbOVgHNnIS5fvNV39673a3v5+QDhiSPGvO8AsW+c/KjwM/ImSaqZit/FoTZl2QVM8dLNFo1WPWrEiOgg6E8Vw==","shasum":"ab230774adaedd539478d6844f07d1355d8e8b53","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511221529.tgz","fileCount":85,"unpackedSize":669147,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc10nbCRA9TVsSAnZWagAAsh8QAJkpQ5pAniXwHaYv9BX1\nMKrQGYlV2yjp767uuwJCXiB2JGg1X0k1eeFNW1xIQcPzW+24/Z/shTcFepTt\nJU3KXydS7m/YckK8j8+QMXTFZHAHpGDO2+SQLsrkWdKqVqQzPTSe7rwA3CMq\nkErChY59FrD06QlfF8ZcHNiRGAwJyeVoUuvGSHeNjVyx83thZLRAfnPc74M0\nAjptwWYWBRLZ7qGQGSBX77v5LNQYkRutQIeffRuTnT6z1mZ6BqpTMzNi0GR4\n3Wv0AjNXd1qFoDlKNWYacHVajelHMeBGwCUJIeaCckBfhx7Cpn3lXPMQCTNZ\nWnuAeKeXfNKjkW2N0gpMXRH3S/nMRDtvbu4hg3cVjPt/LWNEx7JY7wJb6tP0\nT1zEC1qYof5Ju41qfgy3VUhDllqIGI0xMio+xvZRySQek3iROBQ2g3/hqhlU\n+4aQ/0bIjc+d7YUd/xlHRTekHzd6kZFdsP8oQXdQt0okyurLAbt7808r1DC3\nDBpc+iyotOOrCxpqqhiUejmwClZYTHhCiISj0nue5sTMbn3Ze45P/QaIbpCz\n045QdC6G2hB0BinhlOIRGOFxo9z/Jv0N0jXB0oYy0ssQSaWSVWkGo/SuHYnY\nvmEEyz0sQRarRhqG6SxvEcfENsI/3EDmPv33Bx18PadV3PFkEMfUhilrFUlZ\nfewo\r\n=LpGS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFL77wMV0eatyjxpLkkklcRPbEPKAvGT87gt1iMzNuNHAiEAkTAuMjRqjKcjL7Wo7kAdr80sShxXoUD36/c/LIEqqFY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511221529_1557613018744_0.5875893929091776"},"_hasShrinkwrap":false},"0.1.4-mono.20190511222048":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511222048","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","boxen":"^3.2.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ba5d0b1f6cee37f77675babf7eadf522a6f415a5","_id":"@atomist/org-visualizer@0.1.4-mono.20190511222048","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-9qKXHaHblTSR9Gc5dZcKsENs/52ARYl4aqvOLCUFQlztysLJgpMf8jdnWbwfUPCuTdWxfK5c0jwkcp2gObg93g==","shasum":"4b2c4513ae0b234393132af0537b05465daa58d2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511222048.tgz","fileCount":85,"unpackedSize":669359,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc10sQCRA9TVsSAnZWagAAiEEP/RoT8Bq5agqUQN5pQUr0\ntNL7e4j+MF4Cy3nkXJq1ifv2uQ/jD8198PlHEU8DD+g4W7+obVRmOLDT3lDB\nVS9K+xGVgSta7b0g1doNxopEgcq0mLTrVDUpCTJwCCjJkshYLroiddOg7+nc\n5QeOPU8wg5ALt/C2UVU4rxCIYIMPACKesWJhpest5XNGadthk4ajJd+TCGsV\n7gF1xjQm731SHv73JGVPfhJc0kwNjMolZ+d8ApmkrdomLuXmYf49ocJqK5cx\nQp0JXW/kogB23tPIog/4EZQ5cw9Le9DUcAOpKP8tYgGGwF5XZhfDoSMD4v0t\nrR+bZBkPYCH0LwOv0zkHw4/fkqh4mDr5Ih05gz9pU/8dc8XkoUe17bqO9YT5\n58KrIoV6x3fQxuJ5pSjc/EJr1BJ83Qgbwba7/uecQ4GXK+MDnWWKcNmkT9B5\nbMjBkW1JYlfS1Eo5wTClWerCoIFxW5zVqFEUrtSqhY83SzoIwR+7GRQn6PET\nRLwAAUM0hC4RM5X8/XGBZ6euQ4wM2GVh5VvFfrhgvSjmRZO6ZfaNropzWKe2\nb7Kww52/2ouwfoFI0U3xT2Di/VJkl+MkEE+2x+BTRrpixkhE5c6JQfSmy4ru\nKxLHjjRlkcvT7mutvGcljLqvlL5DimPV75ls4vjaY3kVblJtKkvRV+Z+O1gy\nsxg1\r\n=DvXB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE+YWgho9rMpJMvdpMvLTAMq3EYtYvx64k6wXtmXcbnWAiEA0uoUc2goJC3t+6vnri5CgLg2aHa86HU+P2uSBBcSoE4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511222048_1557613327468_0.7486562990063164"},"_hasShrinkwrap":false},"0.1.4-mono.20190511222655":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511222655","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","boxen":"^3.2.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cac96ce2ab0c499adf0979af9433e3fe05f12bc6","_id":"@atomist/org-visualizer@0.1.4-mono.20190511222655","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-kQHyKxVOoMzVS+br+lctUY61XfPRU/G6bslBJ0CLTo+CPkNOUsdOiFxuSNIQSoyP+YR5SZFTfBReCEZg2k5+mg==","shasum":"6d1887dcdbf4307031ffcd3e2e0627bd868d8945","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511222655.tgz","fileCount":85,"unpackedSize":670380,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc10yDCRA9TVsSAnZWagAAm/cP/i1+kR/cu49tZnjLl2J0\nwXbvrkABO/CF1/Tm2FXEfgmg2rf/ctZDC/homTLPu9gvW782GDiTP80T+odu\nd9SPqC+e9LKGR4OAOaIWQSNNtMEehmdg0tWeuHIgs+T9ILybmCctDCknYLSo\nZwQZ/Th80eNS38viuEbkOHHFHjUecKHFTOdG7lOumHwh2QI8ZjlCgPg26rJb\nIWnPV3NtXxqIOZwYjbqTsJdiMscToLPhmmfVM7gFezcoy+/3dk4xELwF7cyO\no7kfq2Go4hcU3g0MZnWH0m7QL8+d47gis4nP/EcDuBMV+gh3dJPjsCDQ/aZP\nbOXTD6T8M71oiXL6BjBt27rb+Hd8NXkfwsIzJCgrWQDVFAPZSBgwqI+2ZVJH\nCxJvzorTOG1cbD/5IHgIUZCh5ZoZlQO4UDJgcSNkxHSA2UOWuMqWd7GIzEPK\njnt2gUdkj5ge2LMKRc9EbyXPB8HI7xU/+ygxpbFcalWTfB0TAlduK/5hq2sg\n5M8MxpP1RF9P/pcRdvmSTbuConjVGgB41xfGmm35lkHg8bHbuyV61zdiE0Vz\nWHTutWo1/RHPs1PiGzyFLA1KTmxK7W2mYqxSVbKGPTznajlZYVbIePj/jULP\nsy7dc12U078Wgf85oDWNOb0qj8wgTgc3Y73aMMv4r2Rb4iu5fcJ1FH2X+I2v\nCBpq\r\n=2jQR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICMa0sOFoHoU4887UUSSpQH3vACnZO45Yk8jGz5VQ+byAiAksq9JSC/fpeBnD1J8+uZ1ssh7hrA5nI0AI/fJSFSgzw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511222655_1557613698531_0.7626740266055401"},"_hasShrinkwrap":false},"0.1.4-mono.20190511222932":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511222932","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","boxen":"^3.2.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"73decc70020419c0b6b5efbaa1ce730c0de3f98f","_id":"@atomist/org-visualizer@0.1.4-mono.20190511222932","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-i6yOO4GCAmADyxKSFRhmdt8GZKMnft6p3xmHY9iSCowDFnjuXX/ElMiRvA8+SSkGB+J3w8x3OqhS19MwWqfYPA==","shasum":"03b48e9e2af7738ae5a6f10b9e01d6b09fe62a33","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511222932.tgz","fileCount":85,"unpackedSize":670478,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc100pCRA9TVsSAnZWagAAVGcP/0UsA/5n8gcjaDcuzdGx\n15a3V6iSIJFH9ujCDHuYQULry+ZbEGIPqjrbqiySRFqTaAp6WrCRI/p8NHeh\n2nt+1JhPUC21/IVQFgRKTOpUSZHYy/m5fdPh/o3EzdPTj7ZzBl/FlJllCCIi\nkLGwlk7ZZ0vCZTfDyg1QGQcChc68lRgYabfZJnJt91qLYmNaJcOiE1nMpKYs\nZYmoYISpZVbrd++sGB7VhvDNIYyobp6PmLo1kc6ubWAay66H6VQ4KzWjzeeq\nB+O7a0HVAABlZOXfNRY6KKg+JXdHghqGoHPs7yRza8p47bSFsWQe06p4cZ0o\nc2VO2XKFoV8Vlnlv7fJKxm/9aNmgH4gp76KnImU1rRFqn96I9FSLDTcU/9oM\nymVppSmgXTKGMFfFfI1v6b4BlAxcjgyMcXlj9l0YvaIValYiHJWcitzM5RNg\nsAtMuNbr3ZX45h0hyNgpU7wfbKCNMNtqx7i3xN/Nkb//BfEEWpZW9E1KO1ZP\nNRvIYiBgTsAsclr1eNcDL9kwOAEtpf3o654coYKKrIG/6pCG/TxQRzilIKcd\nhpKjvDLa/UgVLOoFqvr0Kp1z3hjfSUQ6Lx5m+2UR4szgdctmXFtHbsIcICt0\nBqwR8vF4/2sDEMU80BT1z+J2siWojTeZ/DGf6+97KMKwC7CbVawHfhCT894j\nWnd/\r\n=I0ga\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH2InshRd335tWqH1KFtCMbvhrTg5n5vRQXdFM6mEMXUAiBnGjOBtU1ODDN7x+gIo+qY5ennqTPAVsS7aIEmvJpROQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511222932_1557613864832_0.43961913048081125"},"_hasShrinkwrap":false},"0.1.4-mono.20190511224108":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511224108","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","boxen":"^3.2.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b664b97d67607af6cca87fa62d456a38e3229d1a","_id":"@atomist/org-visualizer@0.1.4-mono.20190511224108","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-LoC5sYZX7kL2+O3KHQGEqz4WWm9GC+bNEeD7Fx5aS/3NtSPJ0R/32WCaUhJQASTJJkChEx9n1rEQcZxmPmybzw==","shasum":"f1deaa653ef1312aded257396feb4c50b8461ef9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511224108.tgz","fileCount":85,"unpackedSize":670550,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc10/dCRA9TVsSAnZWagAAIosP/1QNIFqMmOT6a+qEYcHf\n/mEGhI6A9Yu9HzuwGJnHVH9o0zD19/Ys4PHqfFgxk2xZFIoILIPIs61TbKFv\nTMPGLo0idI20ET4bvV84jF7pvMaC0NzWun2TB6boPH14WvrlGYVmyT9JroIh\nmfn3cs6MCXSHSzvw7v+uYkjmg9yvl6ARmACdkXzVsNT4ud5WamxO4EFvXGmv\nmfps9L+g7mbmM+eIgeVLTx3iGekP1lENoOsRXa6iINSfk/LGAMb9qk4eoEAH\n9BGrxNW+r42J7AJWcrk/GgNEvaW8IhckQG1kcTnHE616oJOMwDc0PW3a3stP\nmk5R9BXeiIXM9uv3Ebv/oz7/CFGdI0+96Uggp36IFCV8k4uCuzbDFU8rmTVy\nD7PnbBng1AQ1yZ9vu9Qf3cxPFVzMbAnmxbCe5e5TZg8R+hRANE3U4+wwZUiT\nhkxzDgA+GAttxdMMm5NPP7KxnFY/bjxdt5RWLiQ4T86qb6ZOKkTi01ti/gyP\ncmQ7OXB8q78KadWoAWIQyLTp3zrRwEfJDBqxaCrfycuiCyzmzziAViLsonGb\np4gUC59h3wyIxfq/utsHk0OAWjDlcUuouEkd8jkxQN4Wof371pHrTcZdPO4F\niqIiU6CSYvfp9obVrYer+59nayNyC+aL0ZdWP6FJwLN0Fd0x93fmlIpX0K48\nj83L\r\n=Wl7z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC4/XaL03jYgHxyX0Q3iO/VXxmvP/5B3rOQfqsxnPm4yQIgWaHMC3j/YJCbdUoxnKb68LxsLmeCxI0W4x/Ec0xnPxI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511224108_1557614556628_0.5884098192622897"},"_hasShrinkwrap":false},"0.1.4-mono.20190511225400":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511225400","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","boxen":"^3.2.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3e202bb1d2d994166ff23ad30b80a651f096fd0a","_id":"@atomist/org-visualizer@0.1.4-mono.20190511225400","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-p7PF2dzAwZ4aNjm7HcWf75j+80dzbhljSwfbQcPiT7XZIRPKxpbUGLUfPJdnBJfX7uNT/VuvTqVjQBBF7n2r7A==","shasum":"8ed361d306b751f7475cfe16c023017c89ef45a6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511225400.tgz","fileCount":85,"unpackedSize":672454,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc11LmCRA9TVsSAnZWagAAQ5wP/0Tw52KasgjQSnGhPzbF\nxCNxDhWW5OFzN2EJcd3zbyszfxv04Ncoi7dQvF9LJsH6+BiGcx6yXV1Skk8t\nCVqO5g672tIL5PflvGGcnHcRjDoYal5gQ63JK0zlanwyGMUUxzjAeqj/GcEQ\npEURxczGjlmkMZO/rB+Xm6sSFHP5Jh2ULvhINSmSfiyyx8RThHHs0zEQt0NI\nZz8udX71I563iotKOn/DW5QbjJwv+Z6nSs3yYjNICPTcEQL8YGF8VQITNVCS\n4iGPLmyTdX3xtmm/yCdBD9KNAy162QdseRQFEuSZd7iNrukgRiKY9Ll3y33n\nMdsGqkOeUcVQs0mPLWQfxUNbpLX3iJrrElbjOS2oBiyWKbjlSW+Qd9M6UoXI\neUbenFjnfLsbjpQ/3eBMCGL9lbYAQcMUWs+Apn3RjlboBOknLPtUJ51EaBVV\nRnvkzlzr87q8AB54lMzVczJKan4J7MvwaRTKDJ50mTNUhWA9rnWx3KUIyGlG\no/KxNgA03/83QMHTaDZe8pPzLC4vytOBmykErsMPQeOnx9bmqVcvuOWGhJeg\nRDZqRB3YgS6SavPuqWJlmajepCMvjWeuOkm3lFeRVS534By59cD8obrH3fTg\nIPU5o2fNZxOy+MHJLLmbhYRGS4DoGVYhHOeqp7NRTk5I4gAMFqwUtI45q+88\nYYkg\r\n=HbgS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDuN37EfcDlQhzgb6LPiGa39XSf5/07QvndkNiCsaH07wIhAK71dmRF8ObiNjlHqARnHU+CNQmZMCyGSr7wmtDKQln/"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511225400_1557615334148_0.3974016459331189"},"_hasShrinkwrap":false},"0.1.4-mono.20190511225417":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511225417","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","boxen":"^3.2.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3e202bb1d2d994166ff23ad30b80a651f096fd0a","_id":"@atomist/org-visualizer@0.1.4-mono.20190511225417","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-uIoutg7EInfoxzrJpBSkKbBTdOxKTfwXfWTixCNE6mQDfT1zitLCuxzFeQFldJflvTORLEege1ZpvypdnYmnhA==","shasum":"2342efe2f207f6faa7342c61fa298de2c504d1c9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511225417.tgz","fileCount":85,"unpackedSize":672454,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc11L1CRA9TVsSAnZWagAAOo0QAJ5XF/RgKiCg/6Wg33OR\naO//E7RTJeVfUVgT6uvprzgqCtthtzI7ujhjh5JuEFAtyTjvDAhfL3ZpKGkA\nNFtuBDyZ+p2BfdSFVZKfQCndn06QME35DltztusiH98fydg0JWFD2n7SrOtn\n8C0w98LbTthC2B7U9ejNkSLny/Pkbsd/j7tkZ+0k2yfsU9csJFC7wc8Bw2xd\nu/Mgh2vrxXADH2B0itXqqWjU/0vQ+yVHbiyzvZp4pq7wNFlZdlWv2GoZvoH3\nN6SqK2EQ4YNkzYP1/pAEZCLJxCv+FJ5K8D/aTMweFEg1QqXzbsogitzgvSgm\n2g5PL7pKtprYAksJ0vjGQ5U3B1gMvd96On0skKd9WUbJXqiy0q+C6AN89ZvO\nSQb82WV5jpe/g2bCPjkSyO+PbHVjUzSz6nv30xSRnPgPh8+/zqz/ZmMqbmxQ\nmcj/1zJ8HQkyNwleaVefiPvQ7Bpqneb84fpJiYe1VfnQHcFyYhMcEHwsXLDX\nh6jwEDKSsXYNmXSsP6BWiw3vjAmQZLp07mTBi0zvtEO6Mct9nb8UXSAuw6u5\n1uJTiHbjxjRbfiX8C+Yh16irktG4jK/AMlF0nRzre+avRgncX4PY2nN80WmS\nkytkxVgvhB2BbDcRvL67YGfm1uBTP0Aett0WLjsaNiqCP2MdebwKBLaRjEqm\nDslY\r\n=zln4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID4F8EjAmp0KXzLk850C2JQfM8qiPWu1Zu1wXTQWuMiHAiEAkOMJfKQ9iJAIKTiN82S/lmnX5pJetcnwkHN+UgcEJ5s="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511225417_1557615348546_0.4196233359542507"},"_hasShrinkwrap":false},"0.1.4-mono.20190511225958":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511225958","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","boxen":"^3.2.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"109b85d608c1e629560e463a99c899cac4364238","_id":"@atomist/org-visualizer@0.1.4-mono.20190511225958","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-1aJWCzlJvf38AbQAZ/Yl77uSQLZamUzpGyIrXy33/CohTv1n9cqj6iYwg053Ttq+hnb7rvLy74AXO5jwA0PLNA==","shasum":"a04478ec3ed5501cf695edd749edf8a6653aba20","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511225958.tgz","fileCount":85,"unpackedSize":672347,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc11RICRA9TVsSAnZWagAAaQkP/3f/+WUTMpW0eLggDh4B\nS5hpecfIKLYNS6xshEd9ap3KUBeUFxK/NvYjbqvYb87l5tRjhA9UFT+CWSyf\ntqlafsKOJZ0t1ZGgXAjNreatcUmFVNBxPmIljE9AqJK5sIDQ55FGPd+98Fgw\nRa2G1lQDrmF4DQ7KKPmRe3f5bLoAlX+mghSs+JiHQmrHCLesH07zxhK8Xuj8\n5XoWn3IKTzvRUh90mxiMbkSq2gejqYxcsPS8cbE7toTHykqWRaRexDMLSpwq\n4BnjvmfSfUND28eBir775jUw4iZvbPoXMXfz6+JQrBTOqw+qqgwyqSgwONac\nuWQgHXqiUjdJ/ZnjOhAPZDh3OSYqPMurlrvAvxF8/HbQNxVjdzOQI/lrEg9n\nWFavy4nU4mOUh++RAs73Voq+ER/Vsdds+Iex0jk1r/I7X7IK73PKZnydeLqi\nqaBR/Zn3+yneO3ZD6nIu77G25hDpvIZq/lJUgGJJ8FmpvZG/2l9g6p98xKLc\nRnPX8tx6KZtTnblrx2HhhWNmwj9tg9vR8gjDKBk4S2o280b9hOjszmfqDJe4\nmO/mKp5rW/A4oYwUWysw49edfYu9GouctvdcVlfbZcKhCmfNvUHFuBQ9i29Z\neH/M0wprKxZNxkGPeT/oUfjBw9c8lCJP0j193V327hga/RblcQ8ECYGAMA4d\nrT//\r\n=QnRh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDqsm726gDU/5RuAEEy7S/ERhdQ2LlYxbMaMHqsEXrOgIgZrgzVVUPBi+lL/h+1fI/m9NDUWnA9KuJ51wWb7zFaTk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511225958_1557615687802_0.22413864886574153"},"_hasShrinkwrap":false},"0.1.4-mono.20190511231600":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511231600","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","boxen":"^3.2.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"989d6cc748863232cc2a3b7c9fc6106848b62961","_id":"@atomist/org-visualizer@0.1.4-mono.20190511231600","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-7LH9wjVVbgT3oM9usHF7ri23Stfd8V6tnw1MZaB/8rFJlT/eVcwjYGZNJP/Vdder2Owzj+iJhl+PKAMgeD78Pg==","shasum":"5a2b6a1bfd6b5a4db28c39b18d868ce1c24ee6c7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511231600.tgz","fileCount":85,"unpackedSize":672345,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc11gPCRA9TVsSAnZWagAA21YQAIfHGX7K8cLUb7zjaxjl\nltWDPMCLaqzAZk+yK+70RdC7uiMClMRzwsI0E/JVovdlsadCGjOKHMSuq5Ds\nO/2wn67VP6ppN9b0YAhdwBQa1JT42D7K0VXpLnAJAbe2IT3izPTtYX7ZG0IR\nQnzmjLCcpYUCLn1lZdjKN38j1/HNqX3/qEP3oM1QrogWvavj/ahFkvjDpmeq\nwxQDf/jLvCXPNihu3kjJ0xCC0ddhILMVAIlnpW5wkaBmkmWFJ545Q3/1nImf\nJ7F72VZ7S2kcIi42g3RBuB8LX4KY2hjW6iY7rZEXUN/DbWW4liFwSLbC6Ps/\nAXD89L0XiogF6LwWL1saBIggvcNckMZZtDD0qN+pWIuYRy89/+b1/2Bk4VXs\nM52pGaJCXbAVyqetD7WJXrPluKK7VnjWzpX3ugc2n7PXUIC+jvTPkkxb7I3o\neH3dj9PiRPFCmJoDtPDsuWVbEE9OFKtS9htpqhtkxIHq3H3D225y1P6OjLbH\n20AdM7Ztir/JjOAO3pm9YytWiwuwMQyzJx5y8aozloQLUgmi5ABqmM39kCGa\nnb4Z6CzgSt/4aIhvTk6EXrc18u8ZzUgsNb/yx7dn1HpuDK6S1vw9b3VFZVDV\nK7VpCtBPAgZLADyacJp0sA03z0/o4HP7Xaq9LrsdQ6sO/d0aPRPAeg9W6EW5\n/FTr\r\n=388L\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID9JvvKqJcIrrKQyejuF9EYA9npR+MC2E4BemvNeLP4HAiEA3BrbIMGlPomFfmwK69CnPJPMDKgsKS4t4ia9YccFIb0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511231600_1557616654954_0.042524816187061054"},"_hasShrinkwrap":false},"0.1.4-mono.20190511233102":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511233102","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","boxen":"^3.2.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"bede7096c5ea6d93dc3cd8152daaf7eec93ae6a7","_id":"@atomist/org-visualizer@0.1.4-mono.20190511233102","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-/zIIc3cmj+qsBKfGYMpVvlLEeTbhTrHde/6WbKiqnnKwSjaoozEsF+FR+UsNIWpLk64opB/0iNzmjhp4Fyun1g==","shasum":"e69b44c4f5bc313f528c6786b46026c205ea6d57","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511233102.tgz","fileCount":85,"unpackedSize":672933,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc11uQCRA9TVsSAnZWagAAEToP/3tlD4wGGO/50S4J+eCb\nV4JnnSUe8MQW0/WzDRHjV1+defMuvDxpebACxHqc26Rn6y3Wi5NkSS2pafA2\nn6NeAf+YzICqu25K7MoWFfU3O0ptF05Vn2g5yukuAnmz3huiAsGaySuTY1sO\nUNYIm836Rdn/wSZsiJDzAT7wKqboI5YaKL4geYm94ra1W/+2YQZQRJN9MZyx\nQCJIX/dgZQMmEl6s5K+Uk2ARI2Xo1FnepaBcVqEJNeJg4u49iL6/yKLf9oyJ\nXcXLlV3zdtVGXQDjadK5zXqV+MTyXMG1pQaL9M94Ahj/+0bdh3tkb22ukLve\nFrVbyM327idFTp2iUQURor0xHtQqspNzaxXxkRO+9PvPLL+sGH0mOOhpm97N\nFYHXJXW/9joLYx75YejU/s8//IzmJ1OyDBbtUf2UFvt0nEim1BOJ9SzOU4ij\nicwNGysSzXECW+JFiTKuNxULFrWoI1ITw0AGAW+OShjB8zouakKfSAAx72Gr\nkh1hBUnsL+gEzwRFITbz5zJDluQGQfKjDfDkwQEcjUfEuoXF99d1dBsUD4/o\n3Tnz8TJjb6puf5teS6DVAvj7brCX8BGB9B+RkMvlOCok7qc2bPwLPBvMEcpU\nLiJ1+QGIgwpgfaiDxvQAOlyBJCY5+5hrB5eS1SScFeSu4SNL8MFjqzbC2aDp\nPnep\r\n=/6+y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDsg9SkKiyEYAGjbEfyr1dmajv4Yek7nA3XqWyQX+VZWgIgDNc8bw8u0Zf9hnL7EBqrj0f/IP7p0daciY8E6m6pf/k="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511233102_1557617552238_0.9883092042807304"},"_hasShrinkwrap":false},"0.1.4-mono.20190511235432":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190511235432","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","boxen":"^3.2.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1b7ebfb17e96d6e992efe23a714b5baf31aae6a8","_id":"@atomist/org-visualizer@0.1.4-mono.20190511235432","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-rAE4jwt3L8mtgXrakfgp8iU1KG5I6zPHmwZeu+DY1C1bwe2DUPm2cqLzZfitFSBTDwZ0xWOkEpFf2qPUSNBqog==","shasum":"5364068d5f34e39f78ef4edc2ba89af94f4740ee","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190511235432.tgz","fileCount":85,"unpackedSize":673659,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc12EMCRA9TVsSAnZWagAAKdgQAI+yZQEzgwzVbyj9s4J0\nCSxHP3QIFkCBQhyZ2K/5WpahAkUqIn37qrFAeJzngH/tad2birDi3ZVVoaNa\nutbo+6f3mCRfOlbheSmd4JHjlwseufUHDNYZkav8KkSvP+8Ud1HdLCXGoHaH\noYYG4OYFSs+ucL8jZTQAcXM6QVkSej/DRWgGXd8XJXrRp6VZhxDpEZRNSpVl\n+hav5Kw+qz3pCY0z2xogx+d3Hr0TzuRQuMehkZOB8Gu3TMCZW2s7nDlD0not\nGzRdCTfJkkwPCRk5oCtknkmn5YpI7UA6hSdrOHXSHxcPNJm7TFZ518DK0Cwm\nKhlxcS6W8Ir5Q4d/iPZTfTMBZg81SOAr0w4YTu+howHYNyMhrPI4oREECz0J\nufcyrwFHJFWNhyhFKY3eFD1E7dyN+WaUzURv9DxYwIYEF+NycM0wlZ1uGUMF\nkmU//lYkp8Mll6HurU5drfvo5hXhueDS8ve6Xvx428YT88/4Fr2L2kDgdhkn\n0EnwsIODAO3ccOB9H/Bku3Z4opbD3rVb+L3epnKqilL1AbTSEUTb79NdBEZb\nJoJW+9LVPnC15GzNSy9gFGugow73DDxP+sjLXU1wxtXkI8pa01/v+Iozq08H\nxE8uo0pJwIUyVevQf3G0rfzuBu7ai9Jsr2gHaGyJWsi5Ba9rp5FJlh3XLvjE\nUKkF\r\n=QLMK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCoUdLe8zBnX+nej7kJqrOwOBEWxqEf8KfkRz07BTP5DwIgO2ZMzuo2qHxZH7hLlGocOhpBtfIpsZlvrMbzdhsiUJY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190511235432_1557618955417_0.32738056297401474"},"_hasShrinkwrap":false},"0.1.4-mono.20190512031404":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190512031404","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","boxen":"^3.2.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ce1b08f515abca0bd79ab6b35a722f5d1d5818a0","_id":"@atomist/org-visualizer@0.1.4-mono.20190512031404","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-hu8aaIEhIOGeeJJ/jlt6tRo5+yWc0oAIWlHhXDI161h6QX6qgswbxr4xlrR9M6ADYHvsRXnBXzxyA6sPe7WiKw==","shasum":"55a350308c60ae23f246640fa7cfcb70828998ff","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190512031404.tgz","fileCount":85,"unpackedSize":677860,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc14/YCRA9TVsSAnZWagAAPhYP/23nVVvE2W2jtVHqjUt/\n9gLVcyGy2RWXiEAvFHjuIdpoP6fU5vEUJ0SSVc5hEY5CqelPT/yU4rlLRg2r\naTvGFe6oWCJ2shFHXv59VJDOy1+B5nFt1p9FISX/npxo19tB4g1xmcoJfRxg\nP+3tnHYbWJY0V0+M2cRrTKidDnRGDhjsDpGQ177IheWjez/J3DzzPLfIW1B0\nBShVqAfLrYpDoLh0no+kMAzYnCiH3mLqPk00Fm1rVXUtSKr4m75UOOO7KeTB\nO/X9JDUiz6BtVR8LqzV1fsaRUxxOK3YKhVIHJV68zZR29oe7u73ro/FdRwmq\nGJk+a0ssWecpwqofc00PHW7/RjKv3z/JF16ErbGXQ+nF10q8YWDXtBwaeTur\nMjN973Sz6oAs1k8saE59aNOwAVspKBrIG4cqIc+5Aj/LeimS8veJ585wIYS8\n2EcpX55yB+hqotxBNH2cwiraUW0NXFRrCVtmu3wi8k6xmLELufMCDMAKr7aA\nVWtuGfcXtKXFVnPbVA2DBmq34mQsGgA2laWNDMfLbPeP2Mib1U63C1NhRb2L\nXFsD4vidXd7DJSOuh9PkScqfv/bBSu3GhoVW1Axd62SwJ+zjFF+dTWhKu9aX\nKWlqYAjqiGRqB4Vfiw/+4dOzS7SDkU8GPDwrPBRV/lxoVHvkGQUXrwpqlK7I\nG6h2\r\n=j9vX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAa6dyxXo+cs1e6HPHT3E/N8Rmyi8fFgle7GaE+RwQibAiEA/V5WzHZrFAmdLim3sP34nc7/Ai1De9K104+POOpu/rI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190512031404_1557630936216_0.4404814283773477"},"_hasShrinkwrap":false},"0.1.4-mono.20190513192148":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190513192148","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2275ade025276925f12721a4ae2eee7d88f7f530","_id":"@atomist/org-visualizer@0.1.4-mono.20190513192148","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-poWdOydFmWff7TPkchshXJX5MWXBoArJS5y2FAfBdd8J8unHzyi4r/3bL0DTBayE38V8zHzrggisPlhLvfeR+Q==","shasum":"66245f9a6a72e11aa0ac44d42c8aaddcbd62f31a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190513192148.tgz","fileCount":85,"unpackedSize":677808,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2cR1CRA9TVsSAnZWagAAowkQAJ0pRLwLNDJBJfu2UxdJ\nrfdy1wk/c1QKnSsHn3nwE02tCBbEXc+56Va/McrPAd6/nybB2Z/CJDAil2Lg\nAlfMyUsgJuz2hjR1kVtf2N5swvU1KLshlcCcpx8qUfvXCuB5MlKRbWnFp7w0\nDS85vobj2VEM4JXufW4ti9oCv2HsfPcRsjk/ZS6qwRLExdQ3JH41xRjt5ZZd\nxOwV3frTX6itqW8moyisEKM4Kkr0cvAPiJGWMzgXsr4X2N0S18ukSB6/cJGQ\nh38cPmmQlky4T3kJQygN6K40T4vjY7A41KqOdninZt+cK+cVZ8ttm6GBAjL8\nE5uqGMgTS8gipvvjnkTRNg/BGhhzsthi3B2h0OsDUO9qMsIND/QebRbiZgmM\nD0zz8qOSRT+8Nd+DaIZdAGMX1lBW4iq2KCWDUAbeBJ3hPBG37mfUUugb8yFd\nc8CwSgWqgYcbOQ3N4lqJtL8+zjKl0udKd6FSujLiv+iAs+QDFe/8d85u4sND\nLiS8ddC5b/EM7nxgxbQj1AxVXvDH0q4rki8jskr2F4kVVdme8U7lHB3L1vBn\npfNyNOOr869eK2PETj3Kfm6+b1lee9nrah6XmGQ0qZmPQ3abja/SrzlBmfZ8\nzN4ufHDTouiBOP+OnGMx+ifdvj4fmFCHPDrV0h5WvAEFyrriMonbVg6NAOk6\nxHMH\r\n=x1Df\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFUupvizob2opqB+E5ZqRTjLNeanI5OxtXFmScfkAztcAiAR0yswOw4+TyKDhs0H8XAJFm0UpBi9LfpJE2BzAXpDOg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190513192148_1557775476340_0.4144759275572969"},"_hasShrinkwrap":false},"0.1.4-mono.20190513210618":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190513210618","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a84c112065a6e237d4b4785ec9571f87cc68bade","_id":"@atomist/org-visualizer@0.1.4-mono.20190513210618","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-wstdM9cgMBkJGSNInRZjaM+wm15ayLY7RdthdKxqXHK0i8HPUhuJOLYDrX44zr+rCwMRy0KyhygPYeih0dAjXA==","shasum":"666a4f4aef481eaa80a1050a423eed9732a1b6b7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190513210618.tgz","fileCount":85,"unpackedSize":678790,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2dyrCRA9TVsSAnZWagAALwIP/2iMhcEh/NAv5l9TZcMt\n2nRQTToT4t2J0F6HSHaTMCHT6sERmTOik3TSUZ5qGZzEXbcWzy/2NXQrFcWd\nMC3Ozzl+Tu9tDvaQvNj/sey/WHjMNIy65IqIyQxsOVgyqNlB0P1BMvLjqriB\n31uOrY1Lc4Uy2Ux13wRn0ymtcPZdbUSlAKj+9vuICn+qiYU2rokVj2xmdEFD\n1cYiKIDkKwaMaNoL46+FlTCS6v2P0XoneA/1HE+rqbFniiCneJqOcmh74Pf2\n3wfMEl7M3xFHQuXIVQfRoOe4/MQH6mYdFuJGHTzDo0BIVlzRLbJ5z5GMu54Z\nrXi9PYPC7Cgyq9MjU54vqEfXlF78GDdIm60gFeKK7WMSGUiQqPy9iOc9bPFS\neeHFeloZLuxK5yd5hw/2qQt6B7fFrweSSvGEXYOa8j0emfkjmx9nCyonFc5x\nwXnodqT+SRfvOrUpUyipgzJKooG/HQayaWcEVe2cGsDfbtnLqtoi2Zmi7JGq\n0fpuvrvjJVV+62GASjLg28lc37Mi+h74uEoXN9d1ITRN5OsA93FTHFuwBdYU\nGzRJdIKkjc4vdFC5xfSuoulT7ibC+i/pU1ZDdYYtIe5csh23TIMJp9TkqLiD\nnxJlz2tZFHUIZRgqPlnsvKZcFUDbLxJ8f3wlx9PoFHMpxAPS1M8shjNZzjzH\nVxRb\r\n=f5Ax\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIERMlkREgIrRgGE7W5GwjYwmUOc8OisjYTvh4vlawCxvAiAqBDdUBOmQ8iG9f961yQ7R/CPFrvLm5XL3lOVdCMmBxQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190513210618_1557781674570_0.5684221322107783"},"_hasShrinkwrap":false},"0.1.4-mono.20190513212706":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190513212706","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-master.20190418153855","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9ba0a2da44951d378e2ea77c399d9900b1a0f443","_id":"@atomist/org-visualizer@0.1.4-mono.20190513212706","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-6etCYnriaZ0PX5JFwmIZsCelX0awjdLQz5i+u5x6zfcEBFCDC3Ijv0aLqc21gPUvQ+NiJn/nHXVgfWwytUUpRA==","shasum":"bffeebd408d0caadbbb3c9cedb83ab35621f7e64","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190513212706.tgz","fileCount":85,"unpackedSize":678790,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2eHJCRA9TVsSAnZWagAAqcQP/36CeFqPdgS43feibDAT\nk8HAM+nKw2zyIPM36HZR9zhdakyMoZjsZVcC7M9tIZdcXqIEGpzr5MxKBk6f\nMAXAKQue73w9ZTOkmAu5ZHPDqxSGsQbtDnUsFbOCjuEt+sDk+rWXfnWQu9wy\neuNXfH9a4TYe+4WYvXtjao3OXZcha2oF8WjKCZ9mV/inYFLHeSw1jCjFh11W\ngOsypN1yop3dPRL4Lmrdr+ORJvH+oitgSWtVCX4ba2uTrOzHGxJSG7rsNQB9\nS1PG9MIw+HtwPSN3U6ikKLo4MZ/aRVyg1YU4Cl6E9gM25My3TEwsZ8jEj2u9\nOalmvbf/QYNVHUrB3qE2n8XnGpmYctz0lYKAfUek/gfTLvCeujw9553OAYGk\nWb/KiRkP2yqIQtHClKfFg+Ah8Fze2unWyMe76mIRhgypTRvnE+OrnUH3jspD\nWF0F60sQMT+f8oxbdJAS8WW3btZ2ctfZisiWvgMPT6w6dtjbdNf6jhJuNrln\nJTPKX7Nn+s6Fnm+z9CEehQALVk6xwwojLRisf7obxU2BCj6D5CtKrX2Elr2J\nM8wUDgeX9Rc34Oj81qCYm3BFV//Qhr+vlix83+6n65iOxAzHpQuMs/vFGFtT\nPaBA/6WOhVXUntGWkvjeXmsiAxp5AM5cInztzXYmJlWQ7mYFYGf1ESNTDC3e\nMvcE\r\n=SKdC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC4Q0IhwEyTiTTP2ZJGvWcin6zjU1M0x1HiV16t3h5JsAiB9r9JB0fjOhfxJaunyiIYAFKlGdKZANWZ+AnKZqLco0A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190513212706_1557782984804_0.03756624232287065"},"_hasShrinkwrap":false},"0.1.4-mono.20190513235008":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190513235008","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"11d74d454cec8438730899acb611f26f925b4cb1","_id":"@atomist/org-visualizer@0.1.4-mono.20190513235008","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-btQu/hT4B1jR4UTKDCrGg/bQvjGCFZa6guQsoq44GKFTm9Ib/7v/Orm8AYxmit0036bPACztvCmSYERa0TGFEA==","shasum":"d77daa481144e86aef8a1a898ab202a8a960f9c7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190513235008.tgz","fileCount":85,"unpackedSize":680225,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2gMOCRA9TVsSAnZWagAAAGAP/At3piyME+T4Ca8rEkSk\nMVEckA6YyWNrGIIDKy9adl7BZmHZKiiJ0PbM0DInC5wQDIhUG29D3NuOa708\nNh5qYV9RMEkEa7+NqFh+yxr/YIxsXSFpGLTdJ7jAyqly8btG4w5OTlrpo9aN\nTFqfXLJxJZqfjmnqOrQfBhM7O2S3dchekTtOOvqU0bnUPYZDwsi3ncAt9/nU\n+V+yBB03aqS3oEJfxCCgh2qRmxZddJ6wBgmyHwtB0M5AdJDwXqRv9N4mg6C9\n8lsLu91ZAUsSBWeCaWPY+c/SaoMXX5uKY65dqx1j6Xl+ij9jNCQzkpt6DmZ/\nMKCz8uQ19/Acqjv+TGjhdsL0HY4zc0dnUo9CdKlDNk2r9dEZ7/c7618d3v3H\nyj9v9gQSO5nbIgs0mXHmJa6KkSJH7biYVmJ25R7PHVAKnBNLWrsy12na6bQY\n2UAcMuPxD8IMSACuFnlwwRR/VymBD8usj2wzTfvd57KgIVsErrifiJHCCgaH\nj+A690GZJZS8K+8huVxyC5ui/a3meaUDfPk/b33LpJ28cVoms9Eo4NiTMSrv\nzMRir/mQSm98wnSILLnjqd6G3oRpGsyXWm0yX2FfwxURR3V/PHo43hppEPdN\nZtwcqwdau8Lb8V8blfMYuhM+2vd8JQ98N5YLbNqr+hKlveYEn8OEST2MvrAg\nkdxw\r\n=zMAn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCGwMOWkmbLCWtNrK9RJDVRJcQ9gHUgym5JjSM31SXqlwIgGOY6kRNgvRJA4mbv+038Zqw4SGYEmflUblROR3qZr2k="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190513235008_1557791501869_0.643839172917388"},"_hasShrinkwrap":false},"0.1.4-mono.20190514000347":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190514000347","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6437bae7a55f1b8c262a26b1a65ffce74068b020","_id":"@atomist/org-visualizer@0.1.4-mono.20190514000347","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-C04zjUTJEdW9G11kVCUpXZBT8PSShCcheo1RMihwWNSCipTtlT6jOXAS9UsopSuV6VcNaG4BlYBDKZOFkERz0g==","shasum":"03c6697b25375486f7345685ca88652d0e0bc270","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190514000347.tgz","fileCount":85,"unpackedSize":680677,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2gY/CRA9TVsSAnZWagAAgJMQAKCd3/z6Ol31a/06daZU\n1jyS5iIVynnbaJjMFU2E4g8vHJlrvbK6OXRNIIWuSmS3TaYGOs+3MGs8eDjY\nrAU8fw+8WH6ZrGSUg/+JbOrKk5lWp5z0bOSfAc06f7JADfYv3Vt1NGmbQN9F\ngLmc4H7sLXPv0af7tnrrrPVIbF2CpdMkqVf9Mpqzv8xlyWJpsnlK2Ez6Omot\niy1/q5LK/ospqOKl1FSdtlqn96FQ8dmjZ7oFqD5TaD+A7CBvXPcy+Jw5daf7\n5S1vevFQtzT4QCQo7mw/Xc06q9araU9zDcArgBhvw/uh3clUKViKjGlLR0oO\naJzDP2lYLwbiABbmPziu+fVwXRhark+e4kZPwsHnSp3YvUf1c1sFVrbb4keU\n43ds6VuJtnGUKDhWGeYy6qn3ZwTBcMuwAaZywz1hHCQX65bzKL3gT60LKU72\nPzAQ/zoUQjredetonrMHt/VZYcHt/Q99zYtmWZb0WxYHb56HbhpKHCBC+20t\nHHlfKr74OZmlVkCYISZ/4rRoFqkqftzQOaBQfp7gS9NZP3zwdu5JZGYZll9c\nwg16NTNA7AE9UGR8xmteFhtxf3m3OBInisCwBPbiyqxh4WQeZ34wt/RG1TPb\nDdiQEYTT4uvlSEeF+jvCj6ZqliP2+tQ46imcVoCJ4LStodypAh8CDXks2I9V\nSCB7\r\n=H7uv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICw1+pRTAOxd+hPq/25yN+OFF0f4sy9jGFGmSIId/gyMAiEA4TbgQqNRldYD2O9NrNnJS0DM+KrmWgkveJHwYjp03nw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190514000347_1557792318508_0.8682137093325453"},"_hasShrinkwrap":false},"0.1.4-mono.20190514000744":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190514000744","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0f14fe42b713f5240e9357b23f70a925a1b3a6f6","_id":"@atomist/org-visualizer@0.1.4-mono.20190514000744","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-J0WyK3K0qB2rqoDOVtjE0N7UTu1vOaVwwOxWbkUPJtmnCiKBeMWnRlpsTLRHf4OxGOl6FfO9hYioY0HN0+nGRg==","shasum":"a87bc032c6c91d8282c908a9e7ae22d1c93dfaf3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190514000744.tgz","fileCount":85,"unpackedSize":681446,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2gd5CRA9TVsSAnZWagAAcikP/j6qe5OTVgD+oJ75SpoR\nrxkbYzDdvuxB4NicC/03yyYJ+0Q/AAohMP/dXppU+1OmNMDXH1RidQZg6UFo\n24TwLI8dAUSZSMTgtVTQQ/W7ZRi9XJ+oBN8zcmLIRzs6BF8j4vb7GnoSSdg8\nZ+Hd/EDNW9AXT0d36rhWAboIg5JchxyQQeiIFbT7Y6d0wpASi9ScdO0vmZBD\n+MeBTixdWY4JwNFgW0jmhAuIxrcZrscbsLR9G/kDjrVihpbYiIxuvYGGgUYq\nPUO+wZjAbdt0zRg69dciPXq+k7PI4UwcF4pC37IhTApjlgqyGzpf04FvT+L7\noiVU1EYVaSH+I1gBCe88jYCHhL/a6GS+AZEwZ8OU0N9sY3PD5B/3Y3cI3/ll\nlVI9NaTLmv1rQa9jb6hoeuvDPydoQfH/dsjpETO8CAjheRx+AOz2J+NN3OVY\ntTR9+Fff8o3VJX4KMA3R5mduyk2EmnJG/z/EECrlqJIZ4pvmi0OmRHBO9y/D\nfhS8uhinxgFF6Ddl0hUINTLAH67kJHItfD3abmRz29JCsRqXb3k82VkKaXs2\nUfQVnpi9BFVIU0NmQ/WWz3MT/vr2OpRGtJMSCvbRz6FTR69QSP58Tdx13Cd6\n9HTIJeSEYEQopEO8zEmSrlneGUwHy8D6attR94ctg/9CG8aAXLm6FH5x/BGr\nfSA5\r\n=xALC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIENtEcMe2kuyElaxvlhv2tfn2DjZjEtYtM+hGbbcibGoAiAdfxrIl+Bu6J2bcPerJo9mUtDgWw4PlWuHqF6qYimRxQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190514000744_1557792633313_0.854375609065751"},"_hasShrinkwrap":false},"0.1.4-mono.20190514001110":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190514001110","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"766e0b2b69005b4ab8c3010e389a96ec047f2a39","_id":"@atomist/org-visualizer@0.1.4-mono.20190514001110","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-elFQSgIBut+QgAkL7zoTu01NC6e0WV/oaLqy6CZINyqMl94f8Nn6WvUekKqu1Aoy9StBqvejcbl69W9vmscUBw==","shasum":"72f9e71a061db53e2ebdb1684cae684b61a0f1f3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190514001110.tgz","fileCount":85,"unpackedSize":681047,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2gg9CRA9TVsSAnZWagAAGmgP/3arl2S/AeBwAlfFFQKG\nI8zfidUoMiN7cVocl04om+oo19xxXjlfqzTf+8VaRlNnvvGwgCn6uKwOEhns\n7t1I0OoH8XWzCTuUg/rhWKRWqcNImCD6Phe1JEmtA4EfnuJ5o7pKfOSuy8KV\nXMlpoxDiqXr7ZAzIn7X0EIHK+zAVRfmpy7lSMIZByIqQxtUAVsy9zRAQy1N0\n2U5NekczjuhUnt1ZhWXWjyvLOYqkeUQW8iBS3dm8hSVTPvSr6etn5aG4PORY\naKwRUklQ5Jh1zVntKGH88V2mfXNjlXAY7RY4DpPeN6fW3F4DurTEgoH/hP69\ndmNVbTYLVl8XFySoEPpDZV28IPt8ghz+phAF4nHUp8MybKzZz59Rh5utgnjz\njcA3tt+V81rIvNeWeWzNFuMqc333ZJ+KoHtmO2kQ/RiIHnHb5py28isIAvDV\nz72aCgjNhoPjiAbYQwRgTkk0b2bpDElTRSuqNu4nUYb29nvnS/RMhgL/Gb15\n8KxYkG8t3JHxdm77l8jGunB7Lis2kx8pRehlLWBeRMdQdszAawG9PevOytMx\nGiGDbxtdGbsoxxr0KZLbXvaD1NeppqDyFllQMSWYLEHfO61SlG/KU4Xje0KU\nfMnsBJpLEe48zDddYn2PsSod6gKaObcQHrqtwndYSLVFBvSWYeY7E0iYi+rV\n9df5\r\n=PS6L\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSVePRxKdIA4yJDF6w4zbSmYEuHv9+7jNAemFO1hv+pwIgYFzMGkxw1adcyMvGKabYg/9Xc88EumjWmTf0QkKY+rU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190514001110_1557792828937_0.14440173788210964"},"_hasShrinkwrap":false},"0.1.4-mono.20190514001113":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190514001113","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js Azure-Samples"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"766e0b2b69005b4ab8c3010e389a96ec047f2a39","_id":"@atomist/org-visualizer@0.1.4-mono.20190514001113","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-gPxrZ6cpxCBeKTLefZy7xkQGKgOR4MbW+d9kqEucyZ0CcOljac/fXtKmd1quV8PPPer6hpxocU20xdczsYbn4g==","shasum":"838caf6274ae7af04b36f85a41c46c6c0f43a4c5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190514001113.tgz","fileCount":85,"unpackedSize":681047,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2ghkCRA9TVsSAnZWagAAofkP/3kWWTqb1asB/ghfIti3\nBGNcOTWfhs4Bj1i2d/tWciOu5w6bGCzQ8rBtV9D9sv83R6w0AnXIGlANmSYm\ngV/a9x/CjRXmI6oZPgo1N/ErOfF4pquQr2Y1byUy8HciPQCWg+JSWqLVawly\nGMggsUmuaeig9abFwu9Zv3zM4EM7kKUzYCfDnvWnfd77o/b5eoZP5NfhPBUG\n4KBCbYrqUbtCBx8t53qeXZy/L9/qnB7bQzXymUAtwpzwkx1BMZby4o1B8T1D\nymU2D0Fu1eHVWb78OcYw004CpLeSYZvN29hx4N6IVRhKiGtiObNQXgnp4ZxT\nLRE74pbqRaHcv+L5sOE0Z+f1gWjkEHIKxSipgJQvpdQdPx42JlrhUNmDaZO/\nJ8fk2SRtsUO5SNt2Ly6La/WeeDvv+OwsEifFtQTnhLOpOl72rVfa03WWjOvM\nax7/jlSXnbD04z0g0Ln+nlBAbztVSPv27xoloZwaICwI2Czn4SIWTovGwlNB\nEf8csnQ8BSd8ZeLXA1zpXAP7eNshBQbLr/0ovBvVDWTSEyzlC4fEZ64qXC0w\npGJ+0r3Kr8pw0arxUQSIegT9fTKE2ZSs5DTedk4I6DXL0OX1qwm2SaYg3YV1\nZfGMQI9Vq8+8eJv+siBm8A60Sl0MX4v+6QeD+s6167wqdl1u3OlBGmIcjpuS\nzdhr\r\n=EGeT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEpr9SEaYPbnvIOIOY/8869vxF7NoXuYSAJqkAzEsasmAiEAy27dQTVWCHJ4pVMaYgCwLXzm7wx32STl1fH42VojRS4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190514001113_1557792867652_0.15884379470415033"},"_hasShrinkwrap":false},"0.1.4-mono.20190514001418":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190514001418","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"93b57d0da8ebf5e6cabdc6f5b9d05417ff4b204d","_id":"@atomist/org-visualizer@0.1.4-mono.20190514001418","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-71c6nsbZYnyOareoW6w20612ZLFOq0MftEB3Emkc6RJ2mzbSapePxh6yeY7EUkV2YDVap09Gl2n+lV1zqmBt8g==","shasum":"97ecd785379e1d8cb13e92e7381a6b5b5d84eb44","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190514001418.tgz","fileCount":85,"unpackedSize":681016,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2gi8CRA9TVsSAnZWagAAz64P/34DvCuQBva7AbyL909N\npEZ194yMgFTNB4Feg+kCbYxkbR7GbJB2xYuLjDEXowzKai9s1GWXUvJckb7Q\nYrqqKCWegrrUo1MD4d2h/yi8zQtodNI4Um4j122szW/cZZTh9einOBXgNjCv\ngIUgwY2BGreS5yBKX2rX/N5leO5tj9sugh8Jv6woZC/7OOFkQDuz0O/7kZOl\nPirSrLeE1kljb+fMISJGsGCtLvJw0DmKEJSv9rf255t1krvBx2YA+rDZQ3ti\nvEHZkIsRLhRrh3ujhxC/p3LCWsfsNm57BqELP3xHOvttK0gefU4Zlq9O0zaF\nC+cP1nErPKG3IT1KsQP5JP7Qi9IPg0Qpxp2jtzvgVzYLvw7XKseqz+oaz8En\nprss1EoVmJ18SWqO6UaAidESd++n75STn2Psox83+vfl9vZOypPjx0mCkQQx\nhhW9+TkGNDZTCAp8IslIHyz3EDlzEYbRrtazDIyuEC4PEY+YUz7qzCRS4wYj\n5Blbnft9JcCf2SM7tCRM5JcAe1uVCvRQVnM7GrVJ6qFiSxxgaYyatXN36Ji9\nSQo5ml+zzGHmxrsQBhHHombUMq0sCTzQrz9VZovTZm6eXLP90DsEsmI3kjdi\np5WVW0cTRzuQgPA+MZGueLX0T2urO1kV1yWBdNAXozaI3Ri6cHoOSiJiqpFM\nCO3O\r\n=2xHZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBBCqZMEiKq/02FAqKqyrFGE9aVG8mJSAumZa4OTztcGAiEA+n/P1UDNw5Mxyof6l/Sf3xenVViZ9BhlIUoo+Cu2t4A="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190514001418_1557792955480_0.8832391630362169"},"_hasShrinkwrap":false},"0.1.4-mono.20190514004731":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190514004731","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"566b9a4f53478d9f1959c08d2160b7603046c324","_id":"@atomist/org-visualizer@0.1.4-mono.20190514004731","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-n7P+5zhoH4QIeembQaZoSMfE6m8wtXN3PWsYr28Zz18bLRTALloBKJdWMQFEhUNTnWweDQnveL0OsFETLW9uxQ==","shasum":"074365bbec8b200e0fac0123d9931ef68de868de","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190514004731.tgz","fileCount":85,"unpackedSize":682631,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2hB7CRA9TVsSAnZWagAAfH4P/RfBwThHL1s1xxtcck1a\n4wQkKLlH5OhIWlrVdNHhMx7yHRzIRsl8IflYJEYh+kYfSpTMKJbrlHrS6tXx\ngTh+SCr6VzxivnnxGOORfnKRsQkg0bjCwxd1odkPkrWrsfROGLQtJMjiP3GY\nE0MCrYpFE4bBFkplltnBEl9J47lmtRAy9uP3ZQm2XxsGGfGlpfVLu1dzUMcg\ngtkIqtfCHkK48lV1BG+jtFJb9YsmUSFGJVCFr9gd/kguPh22mwTE1LK/8dyL\nNiL7GyKXjINaVB0WuHB4qJNQ/5WFSf3EHqqeqXRswwnQU/oK3bbgpqfJ2lrl\nRMmJfsIkNAQUa2pQ6aQr7tBVo/vMw6Pd9hvvFg6i4/DJb+c7+7kLCmmFpSrk\ngq27weSQmRWo7hfNMCCKdD/V6TlilmkWA6iM2mI5RbxodKO9RHb2b2cis6QF\nazxYi+kBcO1H+gwRCQA9bztZYrkIjC7L5nZSnxMcywmklB8GWJL6IlVFEkmd\nep5nYZroHmEqEXmsp9jj9Y7chqm7Z6BFgMraq0/OJs4WZ35RcZyeNgHQ6rzL\nLbOxG4X8R5U6UG1gp3B22K7yOhgiDy5KtJPc/ET71lAga41tpSnm+C5c77+J\nRfGB/Xgl152uDtC84Z/XLUu06QA2+9EDrKPIRQNdcG4RDYD1sht2V78huEYr\nx8ZA\r\n=cIMn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICZ7ulPzF/2KuQXAE0gVu+XrfmM19EBZMtUZG5cPuICGAiEA5brpn6Lm/tcMZrB0+Z5KcA4Rwn9esVDTta+8IZ9ICto="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190514004731_1557794939205_0.6791133289341347"},"_hasShrinkwrap":false},"0.1.4-mono.20190514014016":{"name":"@atomist/org-visualizer","version":"0.1.4-mono.20190514014016","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7d087284d474db6ae3461af143e09173bf5c26ba","_id":"@atomist/org-visualizer@0.1.4-mono.20190514014016","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-GUL/J83rW2qoz1vvc72HWGB2G5usQ1ohiQw46U1zR1BrlRvCWkACa6nKiD/Uev9HzvRMg9t+K5UjkPjjuVtP4A==","shasum":"004519b5d1ecc5948d050e0e89cc4a7e16d36f06","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-mono.20190514014016.tgz","fileCount":85,"unpackedSize":683966,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2hzXCRA9TVsSAnZWagAAk04P/iGxX0+YzWjJPqgZWsbx\nlL2DQq7Shptu4ymawFebXcpJ06JtLKLLYRsk9LB+BQLFq1cqRWRs8wZsNrjp\n2LxuXjMfioD1GUqSC2WnvfzV6vhviFSPjpfHAc3wKaIz1WMgiuQNVPpZbcqh\nlvbUg5lI/WQwKuTiuit0h7lJVbMFNs7cKi12rPTQJQQVfPyStmUvW3d7u+rE\ntpPTsVVqUt3XYAQfPv5+Ka3umlptHIMWdst44kaTzh82sSN/u405CmpZkqwU\ny1Y1I7K+I8k/eipEqKUcIVukMEmldi2eQFpNiWPWblobNdXpSvUTfI7LJPTW\nryJ4GqhzOMTVJk70JWumDeXY7eN8Vr/UH87Q/EdgjtYpbeN3gO0WF2D51dMR\nuXXD1eJLMHxx0G2ViCNVjavwsqT5dYhuhX5PaQVQ3xM5LpqnXCn34bk9flRp\noW6NJLclx7ju9Xrcagw2BttTmSUzb/5XLA0S6QXJneUm5Zc47Q5gAFTju81C\nyQhDHJ9wWG+NJ2rnuF7KKNQSKxxcHrLPnsIxfHp24Rru6iZcGIAp8Ut6lnEw\nWL3zkllhJgo5o//oSNPd64xj2GfFE6chwMJ5FI51bb9rQ38nDWBjZbAU3a0r\nupy2KdqiBkWiY75l0S9ixWxJaDpB1Fp9MHoFM3noW7gfKNoy8IpKYnys9cY2\nVLWi\r\n=Nx/V\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEsga11XLW6qLEqUx4GtJkXS3SO0aXdB1RyqYhdRsQEPAiAEA/NGauF0wG6nBTC7II5e70gRaijM0nzvSUhXxCiC/A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-mono.20190514014016_1557798102758_0.10161287164053556"},"_hasShrinkwrap":false},"0.1.4-master.20190514172051":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190514172051","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2d284637a9b075ac491767054e094275c0f36303","_id":"@atomist/org-visualizer@0.1.4-master.20190514172051","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Ycmw7DDAVzSDKrSNSYhTPRhfJbPr5KmoWkH1SFjvNw3tV3Da4Ov1PesfTVkHA/FjO9Hi/uuzNlN/+XUq2o773w==","shasum":"a917b1436360aacb4612785811708b4b54f9bf0e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190514172051.tgz","fileCount":85,"unpackedSize":686840,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc2vlJCRA9TVsSAnZWagAA51AP/3fwACIi/Lp2rIpbaOOg\n6QapDOQ4yCogKhbI5ZYesytKiE6q2L9Zypuw11p6AHmV9bEwUlAN43R9lJPT\nMFbRraEn/uvxxhvuiLvC/6+mh/ldYRROBxgjZcvwJrrfF178dYCARE5OCxbG\nthXg8Hg8pmLtCoKIOO0UMp35rRfhKRlczkVlizU5kX65OVJjg8myR+afBDcG\nb9EeHkD+CuBQX6fZQL5WJM7+Bg5jrjAzl9yFSp1tFw8Ke2BnV/1lLR72Bx0e\n0a/1hwO1uQI4lBvjIC15IwwqandD8j5wwEqOM9ToFPJn+FGnCNJ+oz7J+/Kq\nBSce4e/5ynLV5uJSjiwbAlqnp4Cmkt7j0y4nKOGODN41kLZk4dg+IjFF/X52\nCt03E0OjwJNSfnJo5wF85H215hD6Yu+6pZHOsuKiWeYuEdNzUOQmnJBLTogp\ngoiMhXQCP47kinLU0QttTZpt+MHZFMze7X7MYL31AdWiqepikeV4dMH5A1Ax\njTuzM1KREfjoiEMQFhSLKvuOrLeqMBQB9IJ0YFZe2AXbTDBz9jYCot8eOQFC\nmXaG6+PHUpgChNiCwwMVJVSXqH9zJbnzO2rNApHQ9hNkv4ps2zH/KLc00H36\n8Ae/6KIbxvW8d2ylX1l7VEte6eCffct8WYcLutYhi4+dEL5vf+nW1R92OqBt\n+nJp\r\n=Qc7M\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDdFxkLpvM1NcDzABnd7/F/eUwSl1/r1ORrr0hysk8gAQIhAMuGc5nqGAEkS1TV3xT93wHXbPieICCPazwN0XTqnSFc"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190514172051_1557854537108_0.1895060726456761"},"_hasShrinkwrap":false},"0.1.4-master.20190514230304":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190514230304","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"096675df987a9a4071c5e8d056b0a0e23764c5af","_id":"@atomist/org-visualizer@0.1.4-master.20190514230304","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-u1pEHbRFagDP20PtxxiBm87l18gv7PMe6cyQIldSSVx7tjKeeEiXBKpODSHPLEvI1rKn3vdwGd24QPzoSm7Zxw==","shasum":"9d37f93a1ae35948672452727441e4a5038ca9c1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190514230304.tgz","fileCount":85,"unpackedSize":687881,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc20mvCRA9TVsSAnZWagAAXp0P/0m5KuUqyQYG0DgFGjJQ\ny3yIHLwWjRf2r+C4DGR4BfiXNalKjc0n2sH5cgoUUa88g+XNOrvfbmf5pRgS\nK8I9rlYLJ+uDAlTKZXgfJKKcRAUObdXM74oEC/jIE/ZsRYaA7JwB8LWlEumr\nYDa3/Zvvyy0PTBiHHeG/schYWhiFHEDXNyk2QCFqU/MzH5/ZCoTDJZaASpOA\nX6NuP9e0ZeqRelJFUTQXMKkxHymdq6nrgaQXnnsB3ZvKc6OBz4l1gB9O++KG\nWuY/FdLW8JAW+1u7afiQs23uwOn2j2zbZr6HO7E2YZ6R2Qf5umNDKO0Tvd4t\nFPtpU0neXP06xYtsApyivpZBo3I0pisXA1e612+pm6d2Q3qcOWXLfGvXM0gD\nCfC7fRkmVP7Oofp+c86vfSDotCFhG2oEQ2uHFXMBj5RBkVXoKqXUn5GlBQmt\nss+m3UFgjxAapV3x2XKgQtLHQTA/FgoTx3uQnSVKeXBAMVVW6kNSrqqCP+LR\nJNKiHDfZfiy7Dl7JNt+7fma8Yu51OJvVu1YjYJqIUdOi4JCAhIju0s7LMDUu\n81sSEkRDEk1eQK5d5udvmU+hu4n+51cRjUP47KykYfz5xTEj6iy1MUo5IEVv\nama4NCTRF8GXj38iWKmvydw9jUSg0P/kecASRwOjaxy/ksPKJ3nv8fo3MEac\nnwMh\r\n=t9f/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIETicbIbDnZW0yxsdLifOQ2Isjr1B7uamhlXHHa8XsqrAiA6nlWqvEp5F2CfG1hct3ih5JOpTJYRLGtmSAbk/1noPQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190514230304_1557875118752_0.20350007705767537"},"_hasShrinkwrap":false},"0.1.4-proj-page.20190516010106":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page.20190516010106","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"fd9f4571f0609f26397ca623b3be1abf275fb618","_id":"@atomist/org-visualizer@0.1.4-proj-page.20190516010106","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-jwQyJatUm9R4EabcCI0JhGTkr3/Nq3gwOnTWGS1pxsqzreMRuHJr5fE7dIAY/Iuy6AX4us/sPJJsKlZqgEyFQw==","shasum":"f533c78fbba6a6a7dc3121d3f82787208a2a1a6f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page.20190516010106.tgz","fileCount":97,"unpackedSize":709114,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc3La2CRA9TVsSAnZWagAAGo8P/3+Shz8PnnNBZcyre95+\nW+RySHeoj8f21D+J7nDJWB7Hxx/XylkgKnnPHJ7DK4phFDgiOtnoxWDYpKUy\nFzdIsbmjT3TfTVwLgNrrYAOgRT+oe3jB0dnF7HxYKX2CG2DDzucTavHvq4Up\nuZQ/BSP0q9Rc6563h6Bym1s4zmbJbEMLG4uKy34Tw21t+KpmClkbrojRiplL\nhcq4iT+deY+9p2x/18Sg2t20aR64iqFNDyICgRdUfVosoDvQqn/zPm6KCYGV\n9rkatyCbIyQQ1466+GuFLVp0ElJDXY5lklxWJUKgDrnmjm3Jjp+RTtqbd2oo\ndaIqPhZqIAMi+QWqhyuuSzErhW14HrVkib+FEKUgVdg+2+C8cD/epfVMz2oJ\n0SwdgpI2TfLGEeBvW94VVY+1LQoWghbgr3oYT1N6Rg6VbabqB1fs7+JoyBBx\n+2fBlBUYK46cGT2sdASn4GgqtZ5yfADyw8BlDr8r8zsWGsP5REx9/fAL1EHW\nefbZwvJPybC9FP1tqvsZF2OurARDDwlTGO4tQr5NiydfulhOAJNxAmHSXM0D\nV4QAJZgqdS+tHqrtRtRtw0CG8MDbmjqNHCsYbqtYTsSjoXM/GnOg+V0OQABI\nBBRiaZshQI5VnA5zds86uNF/d4Vsae53qOWcpveXPgjPuen2wIyOcmemFHgJ\nkwq1\r\n=RAKT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIETNWpfd9RRYdetL4i+43uPm2H+D/vygCCtTPqa4FLV9AiEAqjCtFaF1ZQk5Vv2cCcM8I7rVrRaDyzKNp4ysijd+awg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page.20190516010106_1557968565443_0.7830947587363499"},"_hasShrinkwrap":false},"0.1.4-master.20190517112202":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190517112202","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190429060345","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^2.0.4","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cef917e9069ea56883d1d69421b3c60368d95bdb","_id":"@atomist/org-visualizer@0.1.4-master.20190517112202","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-ID+6uXa2nj2btkc/RzWdenE+OmYZFitLztJYovEwz6CU5KXHfuKE5pIfznPCXK4SS65VnFoTvX2xifJGbCweAg==","shasum":"cc627150018e76ff1320a549e8cf84240f8fcbd5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190517112202.tgz","fileCount":85,"unpackedSize":687882,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc3pozCRA9TVsSAnZWagAAEyIP/2qFCavyEGcQRgZkdSJS\n9mJWo5Y54B6mAba94ows/szLiUu+ITaBmt8DDHvLOuVtWEHgirXrb+MiB9M4\nwpynMrzZj2/gWZzUB46jDP5IqYo29AJKnXlnlVmcT9i7BrOgbysTyT40d0mE\n3WGEMYTGq2s6uaYjdYRDak6sPA8+B2JLbTS302J8dpCBjUoaSsV08XFWAMQe\nhCNV9KWtdFKyIMcl3951rJGfvEOTcAjwcm+1mdJoBm5hpiDQajYzTTBcHWOD\nnjk7MN0D9o3lRcY8cjsy4oh9tUQl3CvBuc7ttFMvZz01zWER9m0tdBGYKgUt\n4JNxP2nsq3NDRUjFVPqASrpiBq+OjvuMEMl2/kwVcC9oQsdBGwsPLmxXJu2R\nCwmJOKKgRLzh3aC2fShknCCdaDt44eYRtmofFVTlO3VhwzsZHD2NjxoxUy5T\neWos/3rlO48WgxnCHLnubfQHkbpb/A7CWJeRhk4286EVoZUW+mCSQTcVH7vF\nFMWm45T4U2YTjqOXhyXemD0dTjUb91Nch2xu7iixOaHgNYlSjx1Wv3JZnH40\nOQMdxSRGjeeShHutuy14qpheNkSk8Xh7qjiwAvU+1zAlTJXai5mX0BxnEKsx\nJepW56Cl0Oj1kaQHD2XrOp4mlYjqz/0NEOn2l1WC7DwXxgj4+h1ZoQTjtYPt\nki2K\r\n=/D1I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvu6Uf4DVV5U4UIKIWq4XG3V4NuLEkZKuyiyPm1W+FeAIgAk4xHZERbtHO5KVkeo/JiaQw1FeSfWft5BCH6iZTxyw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190517112202_1558092337956_0.9727498619719037"},"_hasShrinkwrap":false},"0.1.4-proj-page.20190517173455":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page.20190517173455","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190419141554","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-converge.20190517024239","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190516223042","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d077296e8ee5d7ca1f28c2ea809ba5385fd8a67f","_id":"@atomist/org-visualizer@0.1.4-proj-page.20190517173455","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Ez/HEXMIYKPqXPH5BCedkBK1qGx9xgRIhqMIkdcBBwHeWjz+y2UDfuq2klqoFuySJqxB54ERhSQShGuOEtpLqw==","shasum":"4d28114ed08e4434e4491473c9f8c5d873827d63","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page.20190517173455.tgz","fileCount":101,"unpackedSize":715959,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc3vErCRA9TVsSAnZWagAAMa4P/3VyUcEKqE3B/9R4Sv8G\nA6Yx6hl3tdYK+nXBYaOZqwJt0fz7WDFBHx63yANRduyNpvZdRqawUfa60uUS\nn5rwYVmWgZ6Cx7Bnm6K6aH6H0zVcF562Rw18TXk8zUAnzVUWmW5VIqaDNLnt\nKpIEkvjcEtxmhKItZ6lJ/7z9NrmWIW+wqoHbe/VZyv02ldN+7jxC8/vTbt/P\ns316xRb5mtF3HBMkOnGOpvi8hIkT7gZ3q+JotXggr39ricj61t9TGLdOcKfP\nxPPI/XJAgm/HR+sbKVlOjcFzd3TQhKzxviyZ3fYUG39iNSY7x0VBrFN2Q7n2\nd2bSho5cSUPasrDddxb81ntTI0cZeNo9FMS9W6r8r8oAqBhTmoZvLjXefQZy\nJT2YIqsWR1qvIKppz7pjyKY8g172+0MdHSNhpXc4o+6SSm4vSD5+e3zJFGcv\nTIxlj5ecmpHCfV0L9EDLWJ1yd3KArfKbIFwMDwnCc3d2uTd8UULYroKiTKCx\nHHzFgjxQPpsoDrK+sdk3V63V4G8vU5UEgSLFewdHV9moHOU7w0Hd4c67eu2z\nH/Czc7O19XBzQILFobOmpi4KOnaB/rBcJKJjOOmhe6CAlzGx3YES3B7rf5JI\nYfbTkuNs3Pww6k1fhXRn1jcQJqckBxkxHsBhWjjDGVeG19jN1GU8fGtxZHRF\n1371\r\n=YSMV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDW9pWI8ZiNbEcBZEZhaFz9DensAvK+H30SstwCKPgmtwIgLe0UskkC66nNObQpaHjOUsaajdTN3Uu4LEwe0hv7PsM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page.20190517173455_1558114602287_0.5016815827573113"},"_hasShrinkwrap":false},"0.1.4-proj-page.20190517212900":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page.20190517212900","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-converge.20190517204209","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190516223042","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"69db7626fa41d4911d50bb801f5d9a139f318fd9","_id":"@atomist/org-visualizer@0.1.4-proj-page.20190517212900","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-hndVW9I9ttz5wnTNZqG/E9eChyWSYhtVhiTUC+YYiwfdJip0qEaANXjUixsBjiREgrClU8g6RRu60fFSE0FE+Q==","shasum":"2d5242a1194d8ba97cfaad811acc43788461ec4f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page.20190517212900.tgz","fileCount":103,"unpackedSize":723664,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc3ygwCRA9TVsSAnZWagAAOxkP/RoaCELh+T3xlqrvimKw\nOWEsknKNB9bIzqR54CapHSzZdQRT2YDg4SQWspuAbSRHV2oN1w8JdgPiBSnK\nHhoWZfOKlBZeVf9DbF7/I258JtjN24xx3zvwYEzdj/SsUBczZ1miOWUK14Zb\nCQueDKhLEQ3huogpUhAK/cbyohpNyMbqmR9jBwGBeJMFr3QcKFXtoI1FLV+6\nVolvS3is58z8fCS8xfx/fotoGZNuQkoo/lybpqFzWmu0gLT/C0HQ8WX1iiGJ\ndsvH8IRC/xlgCHJTgL3tdPxVDEKWagbNKXuzgNQcWhhF5nI5UGtci6Rlk8cr\nMDIXToKl8YuOlA5ASRx9nGpC4d3iMZue0jSY/C97UaxYK9WT3X6WAiIbA+H0\nuJCgSfu7CLGgxl412jZgvuZxHrGuvkeG+BaATPEje/88KVnJ0mooCUUsEVuV\nRMvVewgKaPigNxkp3qzt7OzR/wa1wv9KaubYd7GbDuT7zA7aqRl1k95YPQNy\n9T7mUC1JHC7qhjGfJn3GAfAQ09qfmxgU5HhQeFxIdMyRkou+B5f41Scwi4yH\nSX3hLqWRuYwE/O3nRSXzybrUnW7DXOYivCqlR7FzP+kD0cy3/+1qulGPtLaV\nqBGBoLz/reGTyCZcSzhMH8a30K92c74S+uudQvZ+OLeI0fiLtsrdQjNnuArZ\nyTPR\r\n=xv/I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF2UPcIVyiiwmj/74VE4+3TCEuzBYkc6UgVdO+qKPAtPAiEA7eN82Zwsw7uJuv7POat9xZmxNnJhwNTzvZCzP5TVLDo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page.20190517212900_1558128687229_0.8574997163796905"},"_hasShrinkwrap":false},"0.1.4-proj-page.20190518015632":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page.20190518015632","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-converge.20190518012201","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190516223042","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"92faa16ae985a90fa7ebcf4d0a1f16435ade16aa","_id":"@atomist/org-visualizer@0.1.4-proj-page.20190518015632","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-vS5GSOKUztPzp+xrIswqa8zNeEX92O5o+8f/G6+KlfEXfEGl7Wbr7yBRuosT1J/Jv3jI/44++SJft9c2Lhl9Hg==","shasum":"299d4224b840d4a77cd07533e2319864ef02d495","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page.20190518015632.tgz","fileCount":109,"unpackedSize":735730,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc32bgCRA9TVsSAnZWagAAk8kQAJhFq5HwP49ipWFgGVho\nsHWSglmBl2wujCNLT8m+jrp1U/+oQ30ZtrdSfTUZnULEBIBQJxaPMKBHJyDx\nBkzMZKqkPuZQ4JaOs4cYrSiNxxCoyacHd9pSX5A+q1z6x9vhNCx2qmcebdLP\n5OxzO+ndwkVQ7jUNrYIYvw7ZGJDItGc2+vBCV60ZVNA3fHSmqM2/Vo94Tu/O\nFuzajyWie+W7SC7FB1eER0gYEgLbJuEKj5yZ0dOVWXlNI76gh1ump5z55iqy\ngL/M16peitg9EDNLcHrkFJIJrCO7UIENVQY2dRzlqoc1Yxrd8gWhpm0eksPL\nGVaGZlhFPsii6VxfHDB3nnCxutwa1SAfa4oLieElaJk1XCqmCEmLzRPXF5EJ\nr+K/cA55Aawu7TeLXBwtsQDPf8VJzPFa23rKQrnVwgIPjiuJbA5chshiV4NC\njUFe3KNG5OdP2V0mUn94Uq74rqzDLjaBtlslXrE9W6ukgq1sT9eSauoqE0Y5\nthTzzmXruuZerB5ehDz0Zcrm5aSITcobpRdwMy1lxVTFi3z2lpjTe/ruCdYj\nmGkwWlNO4k1PP7Cl9IWhVRX05Ii89kQ/MuV3oDfJdAXG+sj0aHxCduDXPi1q\nS7ikYJyHFA886xbT1iPwd71jK7W6er1DBod+RzadyBFHXc2wXDGhJEFvLY97\n2IiF\r\n=/woY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFcOsHWDbIhNYQ5FmQwPlWHgoWTJGS+cOP1P3YMpE0n+AiB4p+CVKFP7r/qcJ5J3N1S2XChT6FKnQWRklVTfsCujnw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page.20190518015632_1558144735650_0.4270578370312448"},"_hasShrinkwrap":false},"0.1.4-proj-page.20190518174329":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page.20190518174329","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-converge.20190518012201","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190516223042","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"93f113ca28b7d294038625ba4b1cd62029652254","_id":"@atomist/org-visualizer@0.1.4-proj-page.20190518174329","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-fWa/2sPvhaKTwRNB7/FRuIYy+FOfUZHvy1FV8sP5IOFuxjH1M3bu3jLDeiqetKgcgJw+K2jVR8Lsk27jNjF/xw==","shasum":"dc8ccdbc30e6a33d683827d9f99b0d8360befd2c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page.20190518174329.tgz","fileCount":109,"unpackedSize":736708,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4ETQCRA9TVsSAnZWagAAOckP/jZ3we9hVbchhhQ25pme\nNa1HD8mdTMiTqYbYMREzP81/2+gP1jzf8eixO7StRpurh1jruZ9suyNgKdAl\nvVbWuOgSB7RRWGntBoVsYs9Se3DMQLibeAMCDY5OPv1Dlh8KnM4ibSSSqsbd\nnwQxXx261eMQ+EHRUnszldPHje4P7umf60/L5+NsF+3kpyMjVrCWVVocHQO3\nDJzy7BFzEgiFAtRFiUS6O2YKXeWB4O4X6kLQ9xZca/SK3JpaYWTToFXXQ60R\nH4xdYDp+RwoSl2krd3qR35QjlgtXC/fNLBptJGECtBvujXvzkuoJDgbU5gVA\n3c/lBEs72I1FjCag6R+/EVvTEg/eT3MpKiN9P75KQ2v8x6dVQlFj/3BT+/cZ\nAt32xDTawXHOYSqZ6loTvzYJuDXEdWOAbGFPTKN9WicYqffATQ6yqMI4pfuo\nnPrtoBW90UrEQjuHiDaFEcZmeNVyUeRjRweCBNlBJISwTdKvsDuhMBBT8nEC\na95i0w/ubfTgAqEdCAtWoA3Sy8Kn3QR3FjiIAMTEswL/GoYbMeJb4I4ovYlR\ndJuzackdlDqUqh3SiK5KVLLv19fFdTN7bk/I8Qqy1E66eeWUQS7yphVOA49i\nnsSuYcdcqLuhxudAEcgEmy/gLonoPNP6u64XX5Q9+TGpbNbND+qzVTz5Vflb\np3fA\r\n=g9kc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAun3wgVnDwpB5vSSPkQYWp67j9odTHDO16pqm++db0vAiBmhMbVDnBL+FDiTkqFC3luxoTXS+C6bRlCjSRSIvJSvg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page.20190518174329_1558201551298_0.33420275017676615"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190518230955":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190518230955","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-converge2.20190518213249","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190518212054","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5c81d00b5a2585a60dc5a8b4b54e52b64b5054a9","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190518230955","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-EnurtnEM8gtoDmqJu2QbVLjIdSRGVxwGJeqKX2oDMj6hVvfVJGW4RVOUF3wdP4ouocKJlsNCyUDwTyUsTwLgOQ==","shasum":"1a118a9bb9539bf60b8d0b2a044adf1aae5e54b7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190518230955.tgz","fileCount":109,"unpackedSize":739211,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4JEXCRA9TVsSAnZWagAA8ZgP/jB9UU8CNtqU5RjV+pwk\njP9u/0cjwe897dqMjGraY0E1r3lqYND8FVF6AEAORx/4NSrKhRyIjhRrCr8w\ngzJ4UDlv3B7FXsT22cjmIB8gJJzDjPZt40/Gy+uFq3d86zA1o8fM5E6oOLWE\n8l/V9o9dtmGEQc+0z2qDP2jhSegtv8aRHqiSc+FZde600Z5uDh5mAA7arHBG\n3/X4JZiSIQ+6ATsEruJBTNGLP4/m4pdrDpjYHjunuaZHv/pFfKndvtfh+h+T\nxRwyG6Bsq9XM/T3xp+T5qa0D8aLXv7k0qljQnOEk0AQVFujDNN5pHm1pfwcP\nfIQaE4kM2pJPWiJLf3oRCdgxwEIiAi3OgB5czOONgW9eD3qP8+I4KBZT1VvY\nQhnjdzXqKfHFp5LBrSfoIoQS4WzeSL0w73UpRJno8NFk1QKTrwW1b8+9SdpL\nMtvsESfvQ6SgyFYHbePNuxAZW2mzeIAZaJrGDt/mfix8+Vi3cBGTfNDkNu0J\nVIdpROoAkvZuokqxXtr+T57Z2zbl+gsu07TTFG/ZqJ4FRct9YwYs14dgBmWn\nK/xWoX2YfdD33VIqGHCLZxT3al4oqJ+N5AKojoCrW6qcEl+sMcaUGyZEH88r\nxD2/E5HgYingAWNQzy3oMRICdssIon+iblcHILAbngnW9AEWJGAFlMyfTKSm\nGauo\r\n=b5vC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFw4BTCol5Gma0tzfRGOWLY5lmbAZPIAy/XV52pGmc+PAiEA1nGFInaKpBVuvhoPS4cRafposFfvVBGzH7NdJhEvyB8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190518230955_1558221078756_0.6906514997384909"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190519001544":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190519001544","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-converge2.20190518213249","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190518234954","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"44e68e1198a17e39518430f76ab08f7dd4596383","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190519001544","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-7JwCw/WbJVCBb3OeIyb8fd1c2zV/wAqZZubN+2X3t5MxWC1c1XKaHPHZoZWpJYsGATrYrczJg4IM/nCwdkeiRw==","shasum":"8fae9de86f3187f87986b3e944fcadd43eeb89ff","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190519001544.tgz","fileCount":112,"unpackedSize":741328,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4KCyCRA9TVsSAnZWagAAe2YQAJOpaK3ml+x94vkFARbu\nW+Y/6hRysSOM3x9kbfD+fGqxEFH6Cj3Ozk6CDBucgGlNvopy0/b1beq/t3SI\nvmKBO7iNUEzv8r8GkLyVeKu/2Phgsf5wDolgQBuNx40j5V7SCVHrnpq6XAfy\nQEeQqCuRxF2x5R712dtpUqFoXnNTjuwicHNL/TDQL1jOciaM2eDbrBUF1EbJ\nkYuMVksm2i37uNb6en36UGKMmFR8I7DGfvrmiwOk5soJbQD3kXr1kv5lQ/Ci\nzlLVvuWqvLUKZ9WolvYX9ot/yfi2aJT3uPVyL7BPpMzeGJ1O72Yc51icZ2Mb\njZiR+tALoxZTKEh7AQTSCKMM3ovA35BYAjihOkYalBlqvgA2cXxPLTLImjGo\nbufoXCl1BuTWnN+Nr0Fea77CXOO5j0JkFfXj40eG6jUGE33REOyOL+lvZzVN\nEjCRzXon9drnRkSTZXzjGs3LK22QKLJZa9+G1CAvyAtON1XzIf+kUqAOD71I\nvJMFUikFO2Ckt4mlUp9IGxB8E4YD6rqwCu2ljOFdAgqmt/zWDWAxOXaQZ1km\nGUimKYR8IhXhtvMrxYm4ou7ByveucOGTsmmAGEkY60aF2qnR++jfRnPM2IwB\nYoVx6yCAX/NcLG6NmzvTf/rYLHtpNH9F4rKF3i8uNAhQWV5iXRk2pucH+o4W\nYxIZ\r\n=A5yh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGcxW/2zXq/uhK//NIHpBNWszqNQfq2ImDWb2Rnz6RZmAiAVxlKRTM2+9AyOuKZ5BU8veAljb6bcGT61FkMvZAQ2lA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190519001544_1558225073304_0.6854245538460753"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190519022525":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190519022525","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-converge2.20190518213249","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190518234954","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"37a09ad1486f1ef9a22fcc2446809562d12c421a","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190519022525","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-3D2JJa9RFb8IRLThVUDjCkzNMuFTAbtv5Iriy9I4vJt4JNPebKg4bqotiu9NlW9LUFLCzfHLsFCUyhtGn4OAGg==","shasum":"06fe873c341b97f8af8a530b3325cf6821bad0fc","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190519022525.tgz","fileCount":112,"unpackedSize":742805,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4L7nCRA9TVsSAnZWagAAqx0P/jKgr3tH6t6S1xSwAcV7\nuHmeEYGHhdSr6hBpDTHo3LcO0QeUOtVFq+lyetpRA24Qc52/ck57nhnuUBFY\nqWxLIMZ1Lsfly0EBVC8UbvE8ZNxq59M5rVRPFATx5K4zY4ocOgXwa+XQ4qMv\nW3ZZ0JJSbk3LM76QxQDXp4zAxWQilHkGjStMCADdIMjDGtrxhQ1SzZsOSbuU\nBgr8J3X8IykrcFVciurLimvQB9iYSGw+Q1dLGNCBl6Z2Z4jbZgBba7uOOLt+\n73qOgAxby8m+4MJ3XhrrKr4HeUqw5jviccK1VorBiMyk10LVi8pVokGvvVkh\nyDqtOUBGBwWjaD8nSfiwGFiEUYKhHVFSYBkaThaHy/wSuJi59Q/b9ZjXwax0\nNH70ql+cAljhMZxLBpP+RHIoa1GHYG3bTL7OwFtF+VhSudYOMpk8Pq73pFZp\nyIW2+qeTFjszwGXvyeT4D1o+2RVwSici1ZlhaIrdREK9eGniYXayaqUrEER3\nQkt2WpqJ9qqrcuT9GfJFpsSobQ00RvppPCuTPMNfAjRm701uDp6mkg3mCTMN\nkYUHlG85E6RyjYhbdjtlrjAe8nZFfiIDObUOH9nyTQ83OnZxK3w+M2INt0wX\nYy3eYGhlLKwwV45CkxzrE8zcDXqXyEBoW67jp7yYxx417Q/YEhjMS7dxmnsH\nfcQg\r\n=K/0H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC7Kf9/C37PdxxRyQs8ya2jr71ykDVpToFTPEUd2SlxpwIgfsQvPdNrNQBQt/uTiXO6XXLxyis2t+ot6bH+4UFILMw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190519022525_1558232806154_0.9331636300993227"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190519202037":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190519202037","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-converge2.20190518213249","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190518234954","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"303fe269e63ca93a1542ba086c1e6b3e9b770fd3","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190519202037","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-mR8X0RRcsHF8eSWCY7MX0SWtd90VmxzKB+0RZmO39E9kyUF4C8/eGPmuIC/pYzlkms3kZeiby3VNvS0VTxs0Bg==","shasum":"a8d64ad5356ce8da77bc214465a30c6677fa396c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190519202037.tgz","fileCount":112,"unpackedSize":744143,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4broCRA9TVsSAnZWagAAVskP/RoITRRkVQUe1rhn4lz8\n1Pp0GfhTKOZ42wHjhA34Fd7J6I7VdFnlrLZtGs4pxVEtwWQE5CfNGIrhgMGF\nq4aIk4IU52iF/5BqAT6RyxcAcL572cMNrtETVyujlHeN1oWfqzhM2ciLhPOB\n1FKcIUDy3HAiexXJz9Bed3Kas9izSfJrphJ3W5oI8dSkERnfI/PbF1JRd8G5\npDcaHLNIHY4b/x8GPGRHOUJa1t2qUGKQibJaARI+cFVxH/VNfHKO0UpiYNIj\n3dMwz89eSd+wI9dF4PB4nLqh+fG7MWsUrSKyegDP2k2zKw9tYk6eIFwIsQkD\n7HZW+xg+1OiLvhg429VvMR0RnO3c13VfWUPEYJRAPC079iK6ZG+ABU4PzEPV\nb1p0gI2mkWF2AsTZxl+hOQ37x/7R0MmmNt9behiHSvHDpkWfzSR7bip6XncO\nj6SAdxR4uM8LonMejVHwBdX2ubKryzYhSULrPescaC1K5+f1JlRvpi24Hku2\nBQ/PJwqOcDb6zmZlxzuGTdsidWogFaV937vvrFLR5aydG5AQfWEua2Q0GZWk\n/gYVHgD2ZCF4lq8ppo/kfLjF/kIkpfw4as/XUpzxa+VujGZArbaYrnqDHkW4\nm/JLYsDYd2z2MONdpi3xPhKCBIz0DC4q7nEfF5+ljUaFJk/3T0R88efvsSPl\n07pb\r\n=IksZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIExru+bSiiAM7li5QKcYdGjY91fxESCCFcozeew16Z2YAiEAzCiqP+wHo6mH1p2ZTrDe0NgxF5twaoYeM+HsWvimHn4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190519202037_1558297319648_0.6254497519209055"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190519210538":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190519210538","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-converge2.20190518213249","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190518234954","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"82a0ec7d654ed326a9dc162d1ab28db77da15e7e","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190519210538","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-iPaNIEofIluMNVNIBgDD2me8DAY2N+ObajGZ6EfyZu3wBCLBs/sLBoPt+dgQW5LfiPBL/bbEVpx/L/vnBqG2Eg==","shasum":"d3b594764b30734d5ed1b766fc46fff5752d727d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190519210538.tgz","fileCount":112,"unpackedSize":745297,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4cV8CRA9TVsSAnZWagAAyvQP/RWY+bepHXFagW9WMSKo\n1pHW+9c/anaJPIoVI5T5UWVE6illyFMeNdWCnxZRJOIpDcHLgumDJ98tcFup\nffcFDCLjfgixqjokUCZnirGUMQ4E3ydBzHq6rzb01tyR/pwQNN/6yw6OC1s6\nmoT7UBCZYVqxjYjqQWuMbuboLt1HzfhhFJePdaqoWHrnzBJAYDkZfd/wUA+b\nWccn6/I52Oovs533dLUVoGVSS/Av9oGo6/a+ZOGyDKxXIgzIE3/Kq3Qeq+Yg\nlv6LzP0aP9Qi2HM+s8rc4cnvF6kiPN5JxmgjmpnXCMnw3H6upokVgqd5d8hZ\nybJ/aSbLllzQbxUa0HOdyMivkUQjq9EUnAUg0xFScBJ19UkL2MUarzE481sE\nriOOk8gq1/Ds2x7+6dQI3qUmwcUvvLUdjRg3TLzGHG6Dv6whodW75f0azuKF\nysUD/nsokSOg9sfc9rx/HxwaBwDj67SLgY6KoCRqyjs7DT60Hv0EYKFzFz0m\nXqVSOaheincpzMvCsAPwuTNk2TOCoJeXRzoMBCaOGRdBkdWhiTQj+502rGEF\n/3CvUr5qgTOUvSMa0kA8Dtqxp8yg6vA+Wjs9+IB3UnrNUXpcnBc7LCqiZ9/G\nO9nUpD8Dpa9XDHuYmLzGwDaShMMhmDC9TK4eBEH8gkh/2HH5aZSM8FbCxhyO\niY7t\r\n=EFgR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5TbR62oPYvA5qHotfMR3WqNsfIXpjJR3wdDXH7yw9lgIgFCF4qYnTW19H/yMtP0wTl1nbRnrRAOc8PMbZqMQ9VpM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190519210538_1558300027362_0.09528682185168047"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190519214640":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190519214640","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190519212252","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190518234954","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6974eb50ff4b6b44e95d623cdea66c0aebb563b3","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190519214640","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-AGZPLsim1FFQ+hqwcPeyGggOAt9K7GH9Bk/g+ilPERVWhF/R4ZNHei8nGciUHCQrMczz8ersq+Ji+uLQcWhlYg==","shasum":"9f898826f95b8ac836be6e3b45fc8044b9b188af","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190519214640.tgz","fileCount":112,"unpackedSize":746688,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4c8RCRA9TVsSAnZWagAAIw0P/2VIkO9407fXVQSJgFeb\nkP9qdF2K1MwirCBJOVw+/fju2bU8EpZyEWLoWFC7wSnkwT/+ukl20LOXmcG0\nWClsxfMmllvwT9COXdLslCp1DsAJL0aCLHEesK8Vj+VEWWDh1gcBcvBgepSW\nXIg+uA8STn+skz28fYXQUzRCdL/sCHXBIgr4GWyqLy76ui/glTlhWl4IIQvR\n14g0sMvWrUrQAQGD2dEr81Us/WQc3OTH5ll1hyfLB3RXJteevzUHdbONoc4G\nkNG4AbUuFAyBvPnBDckbijpz8Apg5FIth9ZbKU+yawA2sUNpMO8KdF26RvDA\n6I2wEGK2LeKo1g95UxpQ+aYc97aXJ9Z7Pdc2+elRSAH3yzdU65bs01yjEXJc\nftwcVmRX1woK8ulFGdFdtVd1bfPxLoQzEHhTa+IEbTJPaUsn724YGYEkiB4E\n4jRkUfDbJQ1TV+c9iPYBTc4RYpk/lQv2k8PAVaKw54M2c3Sv68yadGrrtMn1\nA1XqgQrLlJIYEvWEI2KiouCtCKbydLjD1wWcsbkI9Rn1y6qsFCZ/QXszgbOD\nXAUoD61eTWorCtqksys121YDeNWHHaJqbN5Tzy4pU4xQXgBV0fArCbD7cALq\njIHia3P6VgAca5SYZtjJwdbl+ZKCf/oEjYSuJ9V0q2vxmUbhyxxSCdswoCul\nJml4\r\n=lJ3J\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICvbGndMFKaAxq06WDCGy5zZN+rKLo0XHEgw4jsuKpqyAiEA7+tfSCGY7uushlU+4K/pVz3JfZX3Qwu69Rs8775ad8s="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190519214640_1558302480466_0.5977953242446228"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190519233629":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190519233629","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190519220841","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190518234954","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6548e931995414f8516029af72133a5e660ccca3","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190519233629","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-jVUtodBFQHJeAIglJ3dHLevOZUxTk16sjsf1tNseYR6Qpz6ifasB4hm0/cmWpPbtKIACd1y7tWFzO7er/Pr4Rg==","shasum":"a9c28686fdb756e3b421542620d83dfa74758f6b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190519233629.tgz","fileCount":112,"unpackedSize":750176,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4ejqCRA9TVsSAnZWagAAbscP/isnEQWJuSbMrfA/FxgJ\npAZPtffvgdrqUq2LBp6tKH9Ww/Y5qYznWzMCXxmmXP62o/68HiSHw6XLwrS1\n+1fX028FbXH12GOrPpBoVJNeuTaxv7jYT9w0olYsvyksk1f1xkOcI0xJVJO2\nThaU+yNHF8AxrZlCBH2D8RYqFg/Y1bj6G1Ukc0/JrOsJnCgokILKEl/z3jZ8\nbVV9ctOJT1naCUYIEi5FvDgqhH/ga4nynlVt7yJkMTNTTAH9NhziWafEtnCn\nj432Bk8swmvh/dE1mqPZn00jttAhDWQg6i8o1QC/TvvFq1znOfTDBDclCw5U\n172MbSBi6rvtmjFX1EA3aK5Wtr7H5n0efOb9dbiV5D3w09ZZvYx2pP0T63fV\ndtcaXKBYJdYd6ZNHIPIG8XTJOHZiDLaPG4BXFMB6vzDg5hk0C5F2uYvGesTi\nvS6yILMbfBCXV2zJJdVdUReDYA/997uXbpwhsG9/i83PqfrVV+HOc5VkZUDn\n9yD+xbzAk7uzfmyo+s0x3cOzPUA7wgc58896jYC7qpIHCSEYGTDQYeIFd2NP\nQr39+fV3ma6JkrMvTXrW0GoFL3+32F+t1cpDqb1FVcL2HzzcFVPGBDMrdCm4\nHdMcZz7tg9yL8rKRpxfmM0JaJ21X+9At5CTb3f/dLAMfNk/u6Yin/KQq0XSV\n+W79\r\n=X6CM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICNCVcsiQZFxuH0EAC3N8rMUkEvdB6jubfuuUjSv1Ee5AiEAm9+JaDXHyOvjPf+o4Odn69wcJ6p4EjfgNp/krrMrrvE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190519233629_1558309097906_0.8697707802067507"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190520215605":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190520215605","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"77b2df0f8022c721b097b6a0a09eb77c85f18ae3","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190520215605","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-xStZ0GBMVvULrub5BU9zynWUKEyXsnC3IZUGOMNquNO+lNfNE3ykX7FsyyL2gIeXP1TCl9P4vClG30pjoC3yBQ==","shasum":"1b7d9727e57e9023260e436a1a3005d94c258cff","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190520215605.tgz","fileCount":105,"unpackedSize":742041,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4yMMCRA9TVsSAnZWagAA6WwP/1wpjv8Rby4Kx9TP0UkN\nwZqBiddoEI1CwEdoAQusUaeKGqHds7f7vwsdZdyAwBmfsHRiOuS983SF9Lqf\n6AZLb6Olclvu0g0YfnVlUFGa/vPE2cQmrCh1OgjWQ4HGp6dZttZKqB1nBxSK\nQuEeuJvyHwlouNDzgDQMIHoy+4RCJPZNtQgq6wA0DET+/UCQ5/eMZW88Bnx4\nCF5745m7QSNnwiy1mAGammRvON1JwABnPUfesfKIM9iu5uPZXO2SKdiqmGkw\nZyIhkwnMXxwiSj+d/hOZsbmMmDv+dtwmVnz4xOxkD1Ug0TiWUA6L1B03Wl76\nQCVnHZB7w3YlXLZqu20Mj6z5Ud1qO00UN26dQJOtNhfsjR+c8+1zAnY51GRz\n9fuHbuU96VGr5r51C2B7VPIei1/F7M+yEuIcCqaxhwn4snWozasPwSaZuBqe\nKU4qriF8TxCH8WK5/jBt+ev3tJ0cZ3B5tM6maGgVmkroNJkE/l9pstyQ42TL\nqzE7rROrfr9A753HpoX80TeVNhjJzwUe1nViEDS5sehYt/fsQ19tvfE2i9KI\nGrjBbNhTEB4HuNA4/+8YwTpNmD+Xr3siHyurju9obubjRfmDUib+oba+jRwC\nN6Akscy4Bw5AI5RLM7lgfIuIx02X1f87ixu8emj81HJOhU84HUxWfIGxrIEn\nKfOM\r\n=Zcgn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJGTT+854sURrgtv+Clu++Qcux8Vf953yacLejXVQkHQIgPKtDs2F/AbuN5QKhjiEGEa6bgbOOFi/YJf3X/TG8VV4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190520215605_1558389515788_0.11800837168965028"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190520215650":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190520215650","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"77b2df0f8022c721b097b6a0a09eb77c85f18ae3","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190520215650","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-cl5K+XBJ20GnVftp5MPL5fBFBd5UyHYsixIoJ4aI2gf/l8xXaihg83uAtCIg6pWKjVqAksBHkafHmNUYIgpwAA==","shasum":"5d6bec97c5ec27100557c57f4ba2e0df11ab9039","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190520215650.tgz","fileCount":105,"unpackedSize":742041,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4yMmCRA9TVsSAnZWagAAq3cP/1h09jEcXJk80iW1t2qF\nr7dqHXLe6skQPCZ+4YaTgOusFTK7iodqUQsjVNSEYIlhyMEwc1zrFAlblygX\nYEinFfifpP8XGLed5SBb35RBjNVJyWOJUzQ3xuQ8yPg4rN4qurCd9FlWqJ3i\nqQimLMu514Arc9jrK72qgFNlg4Dw0I99W2SYN8fiQ0YW7Z6ZIyJcHyqP1MiA\npEf+9kA5l4EmfE05n/DWsMsYom/4qo12+dMddkJb4PWwzAFKNAw/c2d8YQmc\nAe0RWwETHuudU0lJtdP9aUIURc3hJUCEhR2v/ks0RMGH6+tyYIUu5hzrbojn\ng0rI9Zon+uaQnqEMdSO6r373lTFvM8ClTa3g8AT+SEps2WHoIfLwK4oVUb4y\nUE4OTM9l3ir7nKzO2MA7aJX5oPiP2mj/2YZRlCpCYqawt+JKDJecf6gdr0Wi\nGsUkGUCuv/wmHwVC1CaGemMecgf6M8TccrwSoE61mgMYt2Njm5/5w/G/liAI\nNSaib4dHRsLkhLWBEyt3IO7zjUjb2QIdiGsh8iGGFWEd5fdVb063VaycEcLQ\nJ3u0TEBGpFxpiX7lJ4hN6DSThTGyuSTW6D1f5FKqRer8kK5X6TWXPK7dEZy0\n8PeF4pjdjThvBCdY3PUMAoJ2DHhXguBnzzsXXVtn1RlwBEP6SZTddLjhz3PM\noHYp\r\n=vlUf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC5gCM+sBMdqAIz5uOr8GXNtt9TF7H1g6asgAksUNpcSAiAVV/RmZW0MTG6bvnJerqKVRc+Kz3oFwphGtPv8TpYlIg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190520215650_1558389542275_0.06785965309475239"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190520220106":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190520220106","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"623abb9c918c4b91de72951b331a5f13f89069fd","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190520220106","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-KZCl1yqRN0fM8Gqmav7gKJpdHvPrhqccxA6mWndNpx2wxa4D9d4gaTz0714xh/n2FgULQFp2UJVGB11Gjk7pQQ==","shasum":"5d3a6baa4777f26be82b85df4a96b3101751b703","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190520220106.tgz","fileCount":105,"unpackedSize":742433,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4yQlCRA9TVsSAnZWagAAW4sP/AnVkGmangfb3U5bMbtn\ndje8zos2xSo+U/gnnQE1Kmxb6VrrXE+S43X/FWlqVO+vPZfwfngTZoW/f9tm\n1fGcC8Ah6Qt2mxzQiVWjuNXw/lO/kBdq8StZsXg4aDBvP0MyMA6HvTst8pFo\n3aq083VGSkgkkFpBNZUGnFgdkOoR1XN5UAsRE1Al3ovpLTHY4PYGeTyzIhqg\n3PXQRJu1sdyVRCHS4Se+YFoG+LXo85SIk0h3TZeQCJbd7VXbUqroCF2I++TB\nKmu8ciPdTZfyrOkzWXgHUF9pkZmcpxKUByW4fT7Bds0IqfHqnv5WUQlfc0NU\nivxKcHsZ+ZA93xJ8Q+ve1Y3/UWHzPv3jI73CFuJyWx+Q6Ro4aQ4t+fcdUO+q\n1TmQqB/1LzSNZiw1bBYgz0MjciW7N84e8mkelR0cO5wy/FvCP0NvH6Yxrfmz\nPOpEmxApE4J4lKUEjYTvkzKj0h31GP5jXCyD58CPP7pZzdWgsbc/e2wr2Vnu\nOM7OEY0LrVQR7M/L480QNRvZwQbtALYsX0EYEV3fQrQs6EwZt3BuwOkjcuIg\nUNs3KjC9DJ/lecY6ZURBpg+v92+9QwHlwjIzaao0zWv16hX5HvhZeETKGnHX\nQ9mwJKs5BWCp66L0yYb3UggK2l4bMMH8g/elI2OTFCyuvZL2dfojiJCaiz3U\nXBmB\r\n=MTpl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGx9jz0fuVNndVql3n1b8dauIZsonF2rBVoNKbbZi0aBAiACjEuLwGs49JemMyObhumh3yJzaEi6EJ6IYAGXN0UXkQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190520220106_1558389796837_0.786897390986832"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190520220437":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190520220437","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cc7a046a302de6db65134189869c29d7eabb697c","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190520220437","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-mwzPk8jepdBZOIp1uKxHkO4vtSXiIF5kYFbx3dWkptPMV4y98ynnVU2+K6uqKMuGUyqJysfJFmXJu4ryt4itvQ==","shasum":"82a6be303a044fc7b2d887f1a29334deb69e46c0","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190520220437.tgz","fileCount":105,"unpackedSize":743108,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4yTXCRA9TVsSAnZWagAAoI4P/2jj6gZqBSht78vM+xiJ\nbUaJkf9W50CVs9Mf8gERym4O9CWAmUltUrZuzc71Qe0PhoZeehNUH6nWLstf\nABG4u+T1Fco/ExNgIAfEU1o+LZR2aI4xEZWaDsBv+K/HkX7OKqxJZdma29j8\n6dUWxguroGrdXaAD6dasq/or6DifSegGSqJnu8FSEKZRvKYpJ1XvCvXN3XHH\nB4Jbu6yzmUeaX1ScZ+kR87l9kXtBNJrfjE6LWhMWd+BzR9NB5UtChWjxWmG1\nEk6JHUyhAFgzcgDtP/RJSdLfqeaOXd/1nIjwpxMiEl7MIJn2O5DC2jEAFKDQ\ndfwzhaTTxh8bPkqr/gjTYOWMLZLbD6X5j6ZN6Xrqh8dpFH4+K+VbTu7WUjjz\ngAOX2j9uHDMw690sez5qfsmmg+F/n+ZHzjmbP/4n1Ah6t01YCPzVsYLaPhXO\nwmjInoBdoi0vyCrlHZvdLiGkBbi1M7I6Ml4hOart31NCY7gCqtXrvka8SOeN\n+8Qr7Ki1ZJ5fO9etGOoGhkc8MrRmq8YylP3tknfcffRiqCgtHSi5Fi33Thcs\n9RRUY9KC3EWBTH8fNKpSN712dO+sMBduQOORRc6Eo5nJdr7Lswes6/T4hXHo\np/Pa/3frtac8HFcmlvzsIYvi52BJSjGkCZIQX7fZMHfSD0ga9l58Nx0oJlhM\niaAd\r\n=mIf8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDgUvVBSCF+GYXze8Ebo9kvr0wDZqUOeDS3PMY22gPdrAIhAMD6No+Ua9AehAoDMQQtGGQXDBwirsHmTDi4zM84gevQ"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190520220437_1558389975050_0.37816719320616365"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190520221148":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190520221148","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a37edd9112c62bb2bd0f2e73000db895cf1d7086","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190520221148","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-+pLXdZxW5XmfI4hfOFxoSav5tOU0rfsOmDNugNotQkveNaHTnw6fGh19u8npxw9lcEdfO4bnDGlIlzdgTZC+NQ==","shasum":"388d04ffeef7827ad4e11b695200645e6549b5e5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190520221148.tgz","fileCount":105,"unpackedSize":742820,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4yZ0CRA9TVsSAnZWagAAaeEP+QFiOXyf6RWIdTNszP7r\nEwI5F6sjYzDnr5RWzk5hN2ShJKGeo+2uJuEt1sbDQNw/vQGLu6zDi69JHl22\nNG/GnUzuzCtzdBVoz0nM+5sN91a94/1Wi7iTzuHmmGSXgaLM+A2JD1KjFhrT\nB4/Zh72BGkDohQMzXUgGgKhdPJuwi8kAHfkkiZH7Noo+AOgVAsE7dxdWgCHW\ngT19mOORhEvJrHvgpLj3Fjp/CWfqu/SW4Nay27DZbL8OADv0lOpL1Q9M2HN8\nyreX8ShFz2DOCbS9ZmbInKdG57O5cbKWX5SOThdxCoWYaEMbLkheD99KSpXg\nHUNxI7pOxyz2GTcLptcNojGab/exgowz2HspxMiBP4/RPw7/Tu6Z1PWJYvxT\nab9TqX8ZoIGKdjmC6d1CBLWZr0vdM0TfHtcPH7Ywi4jhelWIJSopDhplHDk/\nXH6EXs2ZaNGvu+h8IjB+lEJ26nWwLAMAbxR2aYnkGQDLupXarZs7syBGdJ52\n889QJKntjf9EdNOiWzSBF4aipe1cI6QHa3NIJavuENh7ueezIeJncl6LCRBH\nL6gUnGV1nlVcqjiLxngj+MdChdM0GFBwNdOvne8OoJUG4Il3X76aW68nrTiP\nUMBcjF6GfqXUNy1VLYIKclYQ+5MVxP+tq/5j1GBt/q89ASXk43L+Al5G2Ctz\nPsM5\r\n=r/vJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAkEVjsWYGBt3JvojBEq42QfmWWQUujE+uD16tk00BaBAiEA+eH+PgAwSXJFOwSzMiyHEE0q9/kmkK/J7rIoKxCDtCE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190520221148_1558390387850_0.3213713697254461"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190520223949":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190520223949","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"58895e2f35e0070ef87b174fa78e7deeff35f727","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190520223949","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-64MB/hfhuOqm6OOGW0tTafPbmHCDL49lhUWpRsusJKbK3BhIMsPJfYBvgIx6Jc8Hc670eu9L1uUo4NqmV6h0ew==","shasum":"4e567a598951016fc7a952f4cb1b929cbf05d008","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190520223949.tgz","fileCount":105,"unpackedSize":743359,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4y0rCRA9TVsSAnZWagAAxuwQAIJ7GxppVMN1j1bbtzdR\ne0LG5WHXaDVEoKLKdNW7NW2qOEvigTGVk43FshvEdXTHE3lozxPv0rO7P2tv\nY9Pyl85YC0bj8ryY6yTqQ/FQcqLXKlYCq8887apnZI0ErvNXhvoQPjreA725\nJkA7yrGdTJX4BumnysM4Qv4ELW+mOsT3VbiWoLh6mlRhBUdvt69xfYadf9Go\ny0XiOa2vDg5AbAZ3dHjB/3sURt/Jk1rw9iXtEDC1jFXrRTM2zmz8dvFgim1C\nno5I2Ht5k3d6kLdcWuLZWrX5xGxF67zsj/JC2YZotOZmArpHV7onP6jNtlvl\n2FZ6kR65YcCnHNJoxo6YQiRDsPBhVKtp99ogQRs/JCh5d9NGXBot6thdAbqY\nnqJn0k91kAOmyJxOIfPJaSA+tGCNPMfN1r76gmK7O0ksPF/629bUg+/Ea+bH\ntEv8SfMJnui8h+dlaHLYfZMKJocINGWcVAocweCJpDD3N5AOE0xrp26bMkvs\nDTpErCj5YmT6CEn0AaPuAOkqHh/SbDFgi3r0sp/WfhnoAK0bDov//CD7Frda\n/VIMI0HqSQ2on2IJf2+BBWsPFfjg8PceOFTFuemB5g3KYABUJkjPfUreLyeb\nUFYaCNHErrvn9ftAyL4rKNxUcwuxER7MqAh2sveJM8SsabLiy8hzM/tgY6am\nVmwu\r\n=2iTD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCfaSmX9RLi/nwMvR+DWEG45MSU0OqwqJx+BZ3c4cGI4AIgB6darPn3ouJnuC/i2TrlLdtV4WvTdX7aWZSAX7RcVR4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190520223949_1558392105919_0.26033104467702395"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190520232239":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190520232239","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d090d7468d4f4229f6a6aa416a759aa4d896c8d8","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190520232239","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-vIt05u4cKzbdoVI9S0Z50P6GOiKQdEnaFj/1WYe6EdqrzuW5RMbKI8FotSSipvJkBOGLkqtEfkTUh3gZ0mPyCw==","shasum":"0774b390ced828bba101f715d80a09180d6604ab","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190520232239.tgz","fileCount":108,"unpackedSize":825747,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4zcUCRA9TVsSAnZWagAAafMP/3/aqPSgv09RMyIj3Ywz\nyjZPm04msilbdslUYz36s7c1WK3cUerM5H5ZQ+GzLn+pvXKTlvY60h++IWJU\nDe+4TQyQ3FwSmiNNIeHI6l+LouHn1c0wAXbGi+a0FyLaUrsm14miGx686Sqk\nn92RwOCD65pHle1/RNswTu8w38ne1PuoW6B3mX/uLXmWaD8sx3FkQVvCm9/R\n7dT2p/cskraIWyv8O27eodO4/cjT+zNO+yJas7nZbqTekrOemtGEhR34voUw\nYfYAjPi/NWcI3NX40YJ1/qvyNTMTLaciBq3Q1Y2YUx/NFYR/+KytboW5Mhrg\nE6Z5Mo6ig0zCT04Rn84hbg3TmUNIhJf4rVNLOJydErrFQOCJzs0414/hbGKc\nSpLmZqdm88ADZfYj3XYk+ZydQBMUKnGw8jbY2JSqhRxbVUXQ3yqARf4YWMTJ\nIoYeA9HkpFuVxDB2VwN5a/HJt4qBVBl5D2cG4j8aUr5CtrwP+ORVk8beggne\nUIt8oYYz43K9z5mxTzyfSe0Yu19bQ1ULFHnWvZqd6PCfzrbLTBesnrqOeoGB\nWPUbx/II+P3lI1b+AWdfkTpFuxf6YAGdeCxxlEkfCF58fIvYbCJvfLDPk588\nTnXBMgamaZCpy7m7I+3kNWMcLrLeUPwD+cYNMCa+YBbNNh3SB/daQeg1BPDd\nlwpD\r\n=Hxek\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCL7mZoGcymjU263C2MhV1shPg6Z7ZmQUfyJYC/sIiQbgIhANcvy6zZxl+wC/7MBlQrbHQ9apetstbFAA40WH3fiifH"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190520232239_1558394644222_0.3105017226284512"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190520234613":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190520234613","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider <github organization>` e.g. `spider atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c775e005f58f02542e0160e575e8b40c9935b9ae","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190520234613","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-j3MLN0+Sr8uc0gmANACk9LmCmdJklZiFJ/0lkZPD0KwYMZ86odfYSFX5wYvMGpMYw6TnzmfqbX7r70ca+UNVyg==","shasum":"7e985358d53295328249a6239aefa7bb93df40f3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190520234613.tgz","fileCount":108,"unpackedSize":825560,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc4zyYCRA9TVsSAnZWagAAJXQP/iBI7Rx92RA8DWscpLkf\nBbiaJ2cBJ0zhuyu3Iab5h6MPYn7QH5GhEP7rCeZQBQhFlIniGxjdwfu8W/KI\nLQu0wNkMpSmDO2FKBc0p6OZ7p3rFVzMGnO8TJcg4a1sC1IVs1Xumrqz3ZM8I\nmd4iQ50RLyp7ziXcFRny8+ltmzeJVds6wfUGmjbklfDYCUTKaM1Ctyrmc47E\nH1nO8X104tkAHw304ossy3WKM7XOy1TLcQ7PQ7XXelBDhNCCk98BEuRFeuvS\ny6tuBHoxVijst98/HlkDpw5noOS1jSRR4QVdtlvZHoP/k4G3bu+YxEFX7zPs\nLAgWhspUGudvATYXEIMaXpAqHkqChtAM1XDhq1r25sTAP3tbovgUKUIeicMf\nNTjjs5GvSh2AUCFjDqBWw/Y8EjF2Ll3IJGuYNIiXKeJzCwjLHYhxaanKNW9v\n1BjVx1/7UKIT8S2S9MUjO8zmDy0rSQKcUfgg7+EI6NiPNwoyf3o2VSSOdaNG\ncIV6k28DRH/Nhz7BNX2WTVo7kjalfE6htvH+EnX4L1gsiAe70W4JVsAUZQYJ\no7QOjwIZp9kR8Q2kQCc7tzqaG+5pH+vGGgYE3vNvja5tPfFjG7+5syWUHAZF\n0msTZBQ/1l/rsAP1dA5G6qQQM0wsAYZSkoZo5o+yb5JPVtKNbJ6+xEvj2dF6\nnJyF\r\n=IfJY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDEjupCaoaeNFn2t4ZNpOFIA7f74mXMtCWZWNuIum9PqgIgat5dSMsXbfVOXKcEhA8HBAjdVeibcVUGhVnJsejX4hQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190520234613_1558396056197_0.7016073505344234"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190521200823":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190521200823","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"38a79e6ed883663aac9c4797cfafec3646164b89","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190521200823","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-VcztvrEQ2q22J7Bpz9jnxyZQgzUiPupE0mF6YtiikvxMBecvV6mqCeKbJ/6qGpQDgHLsjH5/ulZBMv7ggMHl0Q==","shasum":"dad1693ddf737e8aa4e48adba2132aea5dccbfe6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190521200823.tgz","fileCount":108,"unpackedSize":828992,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5Fs9CRA9TVsSAnZWagAAGPwP/iZg7Gxk6aiPqJYDNADj\nN9MHEoQE8bijftEXlckWk9RqSPZ9OKCYvvWHx6MYMShEE4+8onDb4JfVdzpe\ndQaPunYevdaiVdQ6vMz7yfUby5krXRlDSgWPys9Mzummku8oWkQGoNbwEmwI\nFTX3VW//RqPCqjlrISSaTWYqOBVRrCeSV9ivRB5JICRwsxNRdbyuYSJ4LbaH\nw+03HFSKBx4TRAPa9f0Gc4rXl+kUQBgsmboUxsP1zR+QlSf+34zHOvHGcLYg\nHNzGyq4pHd0PikRbbJrt7O03OGTd2pBOKiV3dVD9WOyYnFUllqUfvLxfZFkq\nlEJF/rUUVwue0LHN0n+kdPsTaRAJZe73yLcdjFFmSM0kF3alsf51jdLQbKP+\nP76o2xftMTEuMDW+W5+Wu6AKX3l2TFgcue7YPDx5XDZxkBLpGG8X5Nl4TZro\nV0YcYB7Vtlsi0EA7wNUuyVr6fyXwtq3TkIEAMlATOEmujpWPss60RXafYN+3\nh2my4XebarK5C7FkbkIWSJFMrQnMxozMN6FZS6uQXdyWo2m3DjyxVR8s38zZ\nWbVzUAVH3iH0066HXJeZMvB0wJf2Ns1oAqqEBA9u63UAXdn+3CAjDIHSVexi\nhDCqhcJLqIgQVw8KWSgab16SjYfRKlewCDFyiQFwZCvytYr2VUPmiH2yOd4x\nb3U8\r\n=/a9/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEgwI0MCOL2s3QMVsOKaTgDkCHTKh229WtTJp6rVjrZ3AiEAjyG/4AyGLp/Ry4Lglo7uG6Z11bEJYBw4U/qf5U/dTP0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190521200823_1558469436319_0.2711074636619013"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190521203057":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190521203057","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f0008c29445f275aa3757426d987557f220a9635","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190521203057","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-aM6LZC0W9/5UtClurAFelmn8sEQSxRLwe4cRKBCF/kYY3+MurEOFCMXDb8SdYxPm57ijOMHBVhylWnMuG2OrcA==","shasum":"a67c3298001483121017d7501e96421af28a1ba9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190521203057.tgz","fileCount":108,"unpackedSize":830286,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5GCBCRA9TVsSAnZWagAAq80P/jfXcsXROATkDWYvitZd\noo9Ft/hgvQ5f30LOr0mfCpuLYeXBaKWe579RONUssV3ZD/li/gua57c8Rs3M\nk37nQCACizADWbW7swhYI1eb8dVbBBS8PEA4tEBa93SKo2GeeAt+8crxMs0a\n1UmIx4owD+CAgc+TWGgVQYspb7OgKruAT10FRuBhErbYaYW5iIN2UvBopqyD\ncWcET5af2zvYPkYxaf8z9jl3Gioqwy+cZaYZ1axMKrC00ycwaMppbAzlIfvv\n3cYTlPTTPHqwKTB0Ej6HlP6geuCWM6f3O5N9TRYZEKfYeJnhcIcY/WEs81gM\nXheKFogjGdmy9etijqZJjxOyJH1WCrHzpcHHu6PJLW7umyPnjD+sy5Agjgcf\nHc2djqlsxYEM82VpIAF/9AmrgdJXSnshPqh3srq5uSLUAx5IZc12qJ3ksLEG\nzB+F0T1pBtYNNRI7HqKK1wdqvtAxYKaxqQ58qD9Teztq8bGl8ngsxVDclHY9\nYl2bLOrwqnFpRy1OYnwxpNtBc+4JVoOJcjYDS+5Qlp+fhdZJ7BQcql6/JFgQ\nz8Hc4HZDUR4Edt4PcplP5S3B/aGX/nACchxlfsYvRvyJBvr1nx9AFTUDjGhL\not1H3uIXL3yuLhv2y3zYL/DlW84MgYU8n6M1bpE3YrtqdcjuL6g9/pgVe9T5\nI3iI\r\n=BxMj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgmH248Moe9CrHUHWzYoifSfxHz1Uc+ZU7hPb6SOitDgIgExcbkD5n9wz9uYduQxETmeWa1n9v24m45Q6MhHwfMDo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190521203057_1558470785061_0.08833342737929639"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190521203823":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190521203823","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3f17d6aa232d0d4e544deb5d5e208b2a62be25a7","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190521203823","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-ePSUV6UvfHAGeNAVLop2wiNN0f4lvX8dyCK5krrtp+SHDiuSq3A/XeaKgT1Se2u514wkHAqczsWE/wXR+cLoyw==","shasum":"cfa6fb203575fedb39d90d2e03be6dd6fcab0883","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190521203823.tgz","fileCount":108,"unpackedSize":830457,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5GInCRA9TVsSAnZWagAAMOAP/0iuwEACgUngAZX7JVzI\nPWZWSZPffhOPcmwmgfAiUEkXnyrqrnM1sQAWWxSNDoc+GSN0bkJVEg2mDzs8\nLftQ/zB2X/l0uS+4CMp43jLf/RYAI2oJTCodpMaXbKJSAX3BVqlooF3ZcJhe\no29zQxZSYRLEhklvjRVi2TjG3Grzk7ZXC+K9nEdkVijfMFSYRVjbl9T4kLeX\nb8MvmXh4Tu0HRFrM1PAXs4Nnq7mPW7d2OVrGjA2bqAXNw2qKZ3Oumys1efYp\nxELMuw8Xp/AAQ+X+Wwmc3voSI+Q2AqTK+FYM1vkTIv2Yfzl9f0hnNYviKw2b\nQu3I8t2zxOo5Fa3UAY9wsTgQyOg9HOWp5lWknqmliAD0Y3GIHvwWQb6P8u22\nJTqUgHC/6HRSPwPhk0B/xH3iw6HXQR6Uq2LZzIJ1Y9MDx78s6Za1UG0i9Sew\nqry8IFka7FSQT8RHotgBpIBSjrO1gZAzxkDwmj6twS/KgnvQslDJkyBb847/\nr1wGZLn/rbIuW70UBLbhq8etJDRphqWZQ751vuzhuWgjJpoay4+YrhSHAeXq\n14DkBVo0pdXWDMvziVR9Md4HTSP7PhccKLuvkhRoicLLxFaxTyXXS4foIhAW\nG7LFYi4GdYgxB9qgCkgIx7JreZbeVCTYxitG+vZE5Oyddy3cCk898UDrGNGj\nLxSN\r\n=Bi8j\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDfHpG6r4iYN6PlWXl877RmuhQkJrthb+bNCifPdZPxLQIgA1JwAAmIkKnyPkIaoygcCftfGJb5shg/fIS6mFn/A/U="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190521203823_1558471207076_0.8449639377625695"},"_hasShrinkwrap":false},"0.1.4-nortissej.jess-aggr.20190521205806":{"name":"@atomist/org-visualizer","version":"0.1.4-nortissej.jess-aggr.20190521205806","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"acf252aa05a6f6a04d8dc7f1d693dc27e2567fba","_id":"@atomist/org-visualizer@0.1.4-nortissej.jess-aggr.20190521205806","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-e1vJek8zI9KU8vl927zH1RswY/QxGk9Yx5HgvAlAaIem/wiR9dAdb/6EFQJKAIx0V/h5ldMQ1I8a9/NYKw/6NA==","shasum":"a1980bfa529b0f1d832564afffff92ceb97ed2be","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-nortissej.jess-aggr.20190521205806.tgz","fileCount":108,"unpackedSize":831961,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5GbACRA9TVsSAnZWagAAv5MP/0RT/VV64nxkC4oupnEg\nq36gBkwTd0kkaZ21VN0x1uCoeY8jlOV61yx2pHd3jlTDiKYMBk41o1NUdY2N\nylFFPxcefEuqM/fWEhBPcJu5LGxJhIUEZ2nURIe0lZSXC/pvKeC/BVmu6Zmi\nPgImpm79WVo4eJd9jaDDz/KsNgcsLeyWM4MMR9xUsny+0BBxviXBzgXDzZWP\nyREsCnbQJlZcmJ7QMPnQ5/7VxGRNsm26R/La5vOZU44W/s7/+IjEnPKbVr2Q\nwn0iY4/0hVgJm50CbivT2dx2co5Q7rSuj3dBu5kcZC4fCYyJw8lV+VLugOH5\nEx670uOTkS/DmdmNJlto7crRwnSYenTgKqAgdWzt0LpV4TUAEHeumbIDnhkb\n66f3+IgZ3wMlkqaxgwcB5PEynuWo3mPhebIMIfsgqMWhFnosfPAVRxzhU9a7\n6vthZF+3mcrJYraBJtbCMQomfy+hARo3UOLu8LYvUY5hycZJ9yT2oI+R1j8X\nsKkxxr2BGNDPRdudE1+WYlY3gV0GjPo6CT1gQrV47tt0UJBSOyuJygix3rmE\n3GB7LEEK0QI0sZTAErXI9Fp1P01IJ3MUI+y9xOQscHGI/BGHPrfxse690S6m\nnS4Xk7mYM7GJHv9BUlOeFmjv5uJakCmb7f/PLPPz61NDpuSDMskAuR1gBYMC\n4I9c\r\n=Y3RU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQChiU4pmGQPWLlYjWX/+mcMZjjA3uZ/DjcPt78IKuZ/GwIgU/jndNwBxXmxXZPlojOMfCb2SiP+10cfOwQLtEfyxsM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-nortissej.jess-aggr.20190521205806_1558472383529_0.6491046060532255"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190521231535":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190521231535","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a5b913e49f82ed26bc598a9e314bd566af38948c","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190521231535","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-UK0/0syI3++IBiorg8kdYdNBVbiNib2aT2eCrMA/efyoUZYpg4wk+Mc71UGuwEmupdqJClkiuM8ug5MVpOMv5g==","shasum":"152b3fe54fd8666d815d2c045a5c9d59502869ed","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190521231535.tgz","fileCount":111,"unpackedSize":836534,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5IciCRA9TVsSAnZWagAA2RIP/037TqxbUljj3VbFottz\nGURX0zYQma+GPan3GcTOKysBGqVXB5lEzBH1e+KrlnXN6VZgvGNpf+s0DpTu\nBzVdlFflitabl09tWPAqETR7iQ5nX5CXjIUsej1T6JwQyjmHMvJ7MwJMNI34\n8/3uwlJpGcCHxVqAXxtJMbfuRu8uHNA2+KShoIjr18fDqLMn/F0H6tsFjR6I\nDyCnqWsgQD/edHur3pOjT5Sgf3JWULc7Ys9fXDCUkD7Tt2TOw8oWb1hsjTHc\nvZ4JboGXBQVc6dwMEHwjf8fW7Y59SjZxrTdSOaG5iFmlIu2tUYbG9wXByUOB\nrlN1dWZc/DhbmBCikhfG54KsfpK2peCKpOYZqD+3kH3EfnOk/p5lzr16sE6W\nH34JNREmnO7nmk99MNF0LXcG2b5j+IQZtonKupAUVrpyVlHeUIPcwj4SNV6u\nRvebEhxyer1blbdc99sp39FPU11BiZ7AMBPT02wikXecd0o3J4ts6I2MerOF\ncfIF1WDFXcOK0upJv2NSP08koWmwVcMfECC4Pr1Xg5bl3RIoGD6buzT+YIhK\nd8nnMskoiiFl+N8i3Uhydp9OdLt1ydBKub0MNPruICNTgnf9aEHV8Asun6fv\nyw0efQWs6sm09ZUBpJLi6FXCRcVafagsN9W+SUxDf0kb+HNkDB5ex4DnO+vG\nlAH0\r\n=wQAl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICcrfVrwI+Kuv9v9I5rqPhsRcG2Adde/4eHDMZ6H2TufAiAS0WKygX6vHrIVKD96L/xtybh1svXpqtSueavExB21zQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190521231535_1558480673026_0.39830893441901605"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190522220119":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190522220119","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0c498d73af66d5fa73d43477307dc48d84d51260","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190522220119","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-/nEOoYItXzpxTTJTm2DJ8Uc2e9soA3HadO1vTN5G+l0wg+qwfsiLM5QtyEUjT/4VvYKN82Ja4Knrx+2DLmLQAA==","shasum":"7d4aef5afff62d5ebfb6af71d776d4defb39be7f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190522220119.tgz","fileCount":114,"unpackedSize":839601,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5cdCCRA9TVsSAnZWagAAGOYP+wbTEgZMXhT7yrQFz0/c\nJnzfOucG+ZenjVM2geA+GImjwVBDeWWo5V7QdAf6Wo33UbP2MW1T0MX5YO1p\n0pvq75VY5MHo/9V25N5u8T9rmcqgLioZ41O4J3YRm5O9UcXqy2C96SEtGuYm\nJL2MTvn1Sh7yT63KH+a5OqZ5GCRTriIfy+Zr/npI6kejCL3PVMWauVy5h77v\nHHrlUCf5/45iD/vm/zAesx6bWQqSb21Y/NIxR/3FlXwzTun4DVvWx8rWNQoT\niTWU4D6bYe3qyF7nwJoxJqDyADmavOxh7fnqMOap7uNuziw3X4HhMF0U1XA6\nuFFiWmj1HSvJ8iuApOrh9kQGze6MdH3sZuYBJAPWzbBliRLKv1CTrP3LxKZo\nXfMNkQBxPLG/APLM+GWj7pIPT+RF79FT9793z9anwZHzRfJ7j9LhWOVZHceH\nVCR9hKqERlcXWFPXzf7OFH8dlqwt58w5TrgBWKDL+gQ0+6a9F4K0Q06DBN1n\nwL5VDn+oXfXg9yhoB7RpjSV0n7irigMUSG28B8TBIFnTjRwYPP29c2YxLKNB\nNQW8iIWPjmqDUQTilTCvAX8ksG543NdTF1n9U5F9CG6uYvr1hw/m0hAcHSpR\nyiyoLJDdgPoNf0qsBhdI3AQKlbsSaW4TBqxcqug4YDRl1plHrmA4zdC2pi96\nymv+\r\n=DXcD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGKjsoUiooeoQYBj1wBz/FrdJgeRoyw0tqw8BSv7xPWcAiEApfdvjE52RX0GXV8P87nBRxMZrtFki5/pblJrUDcF2EM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190522220119_1558562625739_0.4414404612062659"},"_hasShrinkwrap":false},"0.1.4-proj-page2.20190523024331":{"name":"@atomist/org-visualizer","version":"0.1.4-proj-page2.20190523024331","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190520213913","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.3-converge.20190520205936","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"aef4a9419ec3ac769ffa3b0641ff89b9c4f19f09","_id":"@atomist/org-visualizer@0.1.4-proj-page2.20190523024331","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-PrllWW8Vl35GXX/pwQRIOCVerTTkzuZALH52x0peNCrCtB2k43rO7hSOXmlWeCsVHvPYuuljUfm/hePcQ+BBkQ==","shasum":"15f9cc06ce84719a823d9feace1fcecae0cf755e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-proj-page2.20190523024331.tgz","fileCount":114,"unpackedSize":840044,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5gk+CRA9TVsSAnZWagAASNgP/RLftS33+U3nfPvMl3xg\nzu8sf5l7qXPrRGNzXZwN63L1/ODQDlRZ0eZt/knDYYPe6RalYj67/lEoogW0\nOnAmuqn7IZg7mTCiK5rAO6pGCwzrayeMEwQdCC+bU5VRVfbYTR60u7cIb+hJ\nurdTAHN5tJMIdsDVKzL1VfuRGoTF2jJdMR+WxOIkUbfL9j6EMfDt8TRRwOxy\nv2nAdY1vx58RDaQxToNdCroqNMI/x+C/w6tJfbxrA9yKlmgIueeS1fwSinZE\nR9E+oKzC+z6aYDBnBUbCqVM+pVrOCYaw20tsccFkbXklGi1H7boKHEJr+dYe\nema5XDi2ml81E23JpA9fLIowWjQfDkUVUGIHgM4P/z/6E6+5HdGRyiehoYBk\n05Xcnvgl8ZpC4oYSHp+pxkrcj77LFsObfEsWFiQfC3P3fcTaImiL51KLWIQF\nv5UEYmX9W6zsrDDucYb0GaGPpu5Zv8igXelvXls+erHaeWwRLz+qi9ZFtHHO\njAznhaFCibWiN6RuvmD/KKhe+I7YuZ+Ts809msSiyR+gcewCCM2FzzR1VT1J\nFTuCn3Zep//RwxtIfvVlo/Uy4e8y96QMB+NMKGE1QOBphjRe/NKXRjG4J0Ki\nYJepQ7NUOvUt1igkBicPpJ6MBZRLifJMd8KEYdG/JeVKytbSP6Vie+0aDhgO\naLDn\r\n=f50o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDlu96c5rqtcYJTNo9+35+olmV4dbE2vkyqqKuurGHG+QIgf9dQW4WZTy6ro88LtxSWvSkx8zVSYrcNsA9OblG/I1U="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-proj-page2.20190523024331_1558579517343_0.24313675504738863"},"_hasShrinkwrap":false},"0.1.4-up-master.20190523232226":{"name":"@atomist/org-visualizer","version":"0.1.4-up-master.20190523232226","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190523231208","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"81eae7b88bd65a092aaa76b489eb418220fd2bad","_id":"@atomist/org-visualizer@0.1.4-up-master.20190523232226","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-LIqVdZleTt7OZakAXbCAU6AG9nWu4DcdNFPFnDp+YUiPzJRxZ6eIYA0k8rc3qQXbVZp2gN0qo+szRiUjfCZb1A==","shasum":"c37fed7c731520d9fbe1b8c51306cee82fea355b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-up-master.20190523232226.tgz","fileCount":114,"unpackedSize":838295,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5yvBCRA9TVsSAnZWagAAiZQQAIzLb/43OMIyxZmLuxKi\nixL4NDA6W5dwFs/cTbbxEybO6WR5u2XB0gSKFPE9J8QxHBTNGvLRCNm1082d\nDO6uhet5qt80Vbndpd1szkQfIwV4yt5ICRwW9gwajBHdkMHrp4DtRlMzNmHL\nsCK+MAfWa+oDyGp/BPFa/LGA1S8LLkw9wiy3QUjSyU9Dhfv440I+y7xk1uw+\nyv5WnUzVMzBgO+Dv6hMPw1dNO1XPCtxrCtDjIv7hx/ZVUrp09BsL6UnJBO6q\nvKce3xT/6ltLZeS4QKhuF/VgB96RsMWcymUK5c/aMN8cz9pmEH+PyYGDssgh\nXGeWJhO2Cq+kgrYHq6Udeu7AsnZBJ1Z7OglIOut9A7ZRWXsJdukCO6sB3OLp\nj5oXeZQ/rOmx9lS9te9x24155bs1TTTiZV6ZLZHP1tmfEHLsbemr1Q0RJ3e0\njwTjFdUnXGdj+4vLKCrb22BSdBeqvnydfC+MvfelpzjbuYlS2daxPkHqS/uo\nb4S2ipPB7jMh3ymx0b6SdpKNyrE1H2MAU+E803ea9aAb3Q7Bq1JMSWozmqWV\neMT7tsjL51bwmpSxoqM/cWGI+cvW7amfbzmzgFTQVA3q4uji3Jkz4qIVIVvg\nPDSRw8xf4/sHWH2l0aWMnN0D8FLaZv8OLMnVgyE7GsI7fRBCbE5aKgpwCzQ1\na5m3\r\n=EvNC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDWOyvYYriOZUCIw3VYj0wLsvT2EhFOpP2FpHtf9jstQgIgE9eYj4oFDedCj7JE6OR6G43yH+plHOgIKs/UbPC62zw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-up-master.20190523232226_1558653888708_0.23949086253211105"},"_hasShrinkwrap":false},"0.1.4-up-master.20190523232654":{"name":"@atomist/org-visualizer","version":"0.1.4-up-master.20190523232654","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190523231208","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"58acb1fe2eef70ad91ae6d3c2ad01dc0bb4b83f1","_id":"@atomist/org-visualizer@0.1.4-up-master.20190523232654","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-KOjfBKcI7XA78UzpH+6+P2TO/X6xM5u8Y+LolAgEoFyT9w6iKJWpiZPnpUVmkKE4TDo0MXxHR+7VVjnK9KkwXA==","shasum":"6f10a6df03bc1dbbf9f1eec97941eb90e9d39688","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-up-master.20190523232654.tgz","fileCount":113,"unpackedSize":759517,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5yy3CRA9TVsSAnZWagAAG0gP/1+6v8iC3fMMGiErstvF\nR24UvmwM3DX3L5zvFEDrE/LX21zx/hZjM7UNboDvnOfaysS3rXtIqCCLINSA\nm/VosrVGVmUZ6czQaJIv2bimc7AyTZ6EZU9rAGuaeqyHvnu8Uw8jfdvedwYw\n5aoHsnuLsVhxtJROro9i9Z+i20MmMEffVVQvdPs1jLNh19oC5f/44zAWx8Mc\nsPSUmO3Y4+zFzRC6iWpDrHvLdLlareUp9u92NmIGObaOdh1hRhrE4WMO+9lY\nrNDMl7kEtS/0nwGavMIsrOiS7RPDg989fSRIHcHcth/egTaXgFZ6bQgtnwUE\nml1UeY29nKPn1jmBK87IHhZO+lYKWZ8d7AiaTZX+OW7cRmk0aoI3f8b/nDTi\n6cTFpOfPob80GEllPPMfSbJKB9a28HhSeiTDKimy93jH2fVGnz23WOMTTN5/\ntE6ehD9y1tdceU/xFzlq1Gmvpt7kxyQsmR5qLU3s4GN3OE+BCIBtCdNWT3LF\nc+EAgXO3NQXfyhf8uJM1oZdC0LrIHrdGxGCrjL137g+UfQZUAO1X8qkNYn96\n2yNtEmXM32Ov1ZIjMvTxgv4BHhc22O5b7LUjCzzUPbsYlTfiFjUcmPQxgPZ9\nQuG8zKHRzpq11OubWbxWGV4Mau6mZk9siEBjMpTpedj4prSYfalUFbOMMILf\nCfTg\r\n=iN7Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC5YFzspYLkpVlwgZLAzNa5PbPKcBrCfYPCgQqb5XJxAgIgZoosVuHcDPjAWy+rH1ox0utC8espCJIyQ16YSWxbtas="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-up-master.20190523232654_1558654134742_0.3274545367286419"},"_hasShrinkwrap":false},"0.1.4-up-master.20190524010109":{"name":"@atomist/org-visualizer","version":"0.1.4-up-master.20190524010109","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190523231208","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"bdf19d7a0ac6bf48cc6e25a1eba96f96acb222b9","_id":"@atomist/org-visualizer@0.1.4-up-master.20190524010109","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-ul2zWidrBk/6OpUHG6BOHEdSr2B6yM8w/Z8IKYCtNvt37+uNTZtsVOc+qVDrZzcIfteV7W8+Wnia9oP9YfzISg==","shasum":"0fe5ff8402fb3ad978c8f4c742b349f95a0fd1e7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-up-master.20190524010109.tgz","fileCount":113,"unpackedSize":759017,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc50K1CRA9TVsSAnZWagAAgOMP/2hGG4FuE7FGk81BjX95\nVF84MulyXAxR95ScXxx3T7EfAP0lliEMl/R11V5c8PRywzVUZd9FNqc790GN\nmdO9TZ0/8Bn0FvAzNcQ7AF7eie5e7FRQOROHgfyNIlJEep2HVYzsbqLQMYtE\nER9tK7FXXVldjl7DyOVqVokzXMklIENfZ48ISEpNYahf1xPbRxAo/RZU5ocV\nstpYBTSViJS/e89g6ly6pJSeSrD32lg11tI99wnJVip5S9BeC9SwhwghwWgz\n/kaIPp/XP6Ww1P6S7TqlXEghAwLOkcyPKnh8YjYOaleRr2roZ+P2iS039lmE\nChRdwMLqQ2fLoUv6/KVlyy67V1lWxB9lQ4U8tsOSF/O1WpnFAzo3YAtcFp2J\nucJS/xra37ie10UZpeb0ib4HdriqFsQUpyEFKbU1Y2VFI7KIWKWGr3cpU9gr\nm56rUsMC1heDWCvus5OnB6Pd/AcWmjiYZc8FgL8fMpwlNAKESAwZNlRlWbPf\nT8ZJj5TWlBs7GOgPxuv4+ts+iO6Uen5FQN3utQYs9LcZLNN4EHHdFzT3Kuab\nJBDw/qQOwp89PmZo/Gtbfu7WjEsGvLjZ8giJGZbEglgm4vUFPPbUCZBztJr8\nMwR8Mqeo+UhrkOD3519jh5RPIVU6A1AxHBBIUZuKxaf88Jf22+hZQHEN7p6V\nXpnM\r\n=3Wva\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDIX5jQvHIHNHj20zQYfff5kC111jDKZcWHBeOJpUJq9wIgGp4J44ORhJxT9XsG7UF9PIMI5IhTaARwGTR7ODwnRKg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-up-master.20190524010109_1558659765048_0.3752698147687239"},"_hasShrinkwrap":false},"0.1.4-up-master.20190524163956":{"name":"@atomist/org-visualizer","version":"0.1.4-up-master.20190524163956","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190523231208","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3bdd8de3f370e92308bce56a7ce79064c74ab130","_id":"@atomist/org-visualizer@0.1.4-up-master.20190524163956","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-NK82N6A+FO2EPgHa8+jxIwKQoSD/4lGRPgz29ytesjgP1qCcp1OftSCx+zHwZfYRq5PWgjggeWgqM/s2LwxMWA==","shasum":"1dbc73ffffd587bdc57161be570752f0f691fe14","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-up-master.20190524163956.tgz","fileCount":116,"unpackedSize":759988,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc6B6/CRA9TVsSAnZWagAAAg8QAJn49ObXHGslpG4xgIH5\nc7GqxVjmVflyOCbQhNsgqk25+9ws6VemER2O6Nkb2yi1bkxb8yyeQABSNupP\n9uO5YIZdTFVpCE+Ka5cEhUCpqXS07qCTgLEsNsa5hN9pvI2UImCCqYf/Jg+M\n93xv4q58EaRpaZpA0MPzjip8F3nczNO+UNLm3So+BYfuEqh2P7zi2fXj4/8u\nWYt05yEI1OWGPURGDjJseCPbBDlvs9zlT04Hg/02KRYx7xDusicO/FCiWC9s\nDRQ7G4VjjPKuoI+aNR6vlG/S3FA6/uadUb2OaMrH6QxS75xLKDB3mPeIYpQm\nMs10TBgRTab4mOxMhwfrRhySl+2G1/efVeoUVEZ9kM+m3r3FXlSq2KX7sM9F\nVp098vCoAXvuQ+sG/04Dz04Ep8RlvMEY3e+guyE73YQ08VnmZyNXbuJPLlrc\nyJIwzKEb9M2AfaGMUKGOKLksS2y9pKwBDZpffpe7JTj1/z6PfKhz7Huxve6X\nvlN2o//CC7vZK+HBXMSzx41+74ARQD29Oa6jSChv6bWx0QqUpEZQHNarpRIn\niG59GaGbDA/BPzT8rv/PaHoJ+RBdF5BN0hHUjVq++yG2obgAUBVfGdX/fV5v\nBXGfd214IBPtAsWO+d3PQTWks1mMke3iTXM3grEwALqzmeUaLoRqoJ86A2V3\nE9SP\r\n=yXSK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC5jvo56ONSHCy0sHBi+vCTcrBnTJ4LcIhm2tN7kilcSAiAV1K0cTVVZyFR6nLyWPR5eL8qE/jtxPJYEn/o2DsbIVw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-up-master.20190524163956_1558716095196_0.6636572202023678"},"_hasShrinkwrap":false},"0.1.4-up-master.20190524164459":{"name":"@atomist/org-visualizer","version":"0.1.4-up-master.20190524164459","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190523231208","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"13fd3a19b4801302817e94411a190c8d1f851e6a","_id":"@atomist/org-visualizer@0.1.4-up-master.20190524164459","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-HSaCGU/4K+2wXFMTxf8A4IxKhqGjozj+9G+rujg5YPceyTZk30Pr5U81eIVRVeEpoKuiZ+2JioqVuCVmZ8+E1Q==","shasum":"f2ca1537470c9eda058a42f3005f48e97ef0e881","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-up-master.20190524164459.tgz","fileCount":119,"unpackedSize":761334,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc6B/wCRA9TVsSAnZWagAAzoAP/iWzAQ35OP+F6FE9SZT/\nUgqOxGxcpIqJZBSp5gKnmiGSHnL05ZFmxUG8BKs5lmuIIvFwBDEHc2O5WqQj\nUZJWEINiWJPQQhmJjf90m0SXcS9sWBRutbUG9UQDnQ3nBg4CGDf/lNnHKlVS\nCejz/wHmnov6IvfJ/3yH0KRdPkPzmC2NJ4GPaDYE2wYtdf1MrFmbv7EHxTuU\nChcbFX/lHhoOD+uutG0STLl9qoPvyIOXfK2VDcJipBMH6SS7kjHLo8zSfM6C\nTCQFweHYZBwvj7ReouRi7fHVNB6ksK6W3dBqHKIk/trDUQvsgyNqE9oMOsGx\nQ5EnKRWJLT66ECH6CitSNIk4+nJK4WAsnddC42FKeY4SW33FF6kYauHGU6ii\nnOL+QCXoGROezETDRSSOTtSKfg4mb++NL429ph7fW2rgpHKp2zir5ofE5+2J\n5CEcBC5hrc3VqVp/yrMg9LxaPZCk6iF3uj6ZGrs1xlGgm4gkKeNp9gnMalAD\nB1QaI5RrmfAs3+A9RZcA172r/FGRDqYl+Vb+7BIYPlzAKBbOT+qsDyIrgdUj\nEtnYHkbmt4pPCF6up4ZloLicTPhA1Q4bfVc/fxejmETLEB9tdhgyQ/N+lFZy\nrRqSUucN8E1DFJrhi0OwJqJA5rBfngES6aiNPqSOmqkRFL+2xYhCpVw1opqe\nNjpU\r\n=e1g8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDodiTvfjwzJeK+f0PmOfY7osKdnqIong8k4RUTS/SZ0AiBYwlW+UQqRqbUgQrWN5D+YXGTY2l9SA/F7HIxdV5u+wA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-up-master.20190524164459_1558716399577_0.2602856978699972"},"_hasShrinkwrap":false},"0.1.4-up-master.20190524170605":{"name":"@atomist/org-visualizer","version":"0.1.4-up-master.20190524170605","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190523231208","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c16c593f98c26495b0bd32ea35dff58ae99fd749","_id":"@atomist/org-visualizer@0.1.4-up-master.20190524170605","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-o8qKvwv0+SG5QfHjlj8c8f+4r4SdpDRiNRYI89DbHK3Cdc4yUzHUU27eap7hCgK9ccYYGbCNQjPOjxLSoNDgFw==","shasum":"96108b60b1e97c828bdf88be310672d7c725a081","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-up-master.20190524170605.tgz","fileCount":119,"unpackedSize":761051,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc6CTuCRA9TVsSAnZWagAAYaAP/Aor1JqgHj7fU9soIeOe\nTnXvXCnYJZuGo9Sp9r/y16N+gTR6eew2Z/Dozjs8iR3gQOj49BoqWzgayfjf\n6P/XWl1gR5aPDadDknaa/eYJER0CsBc3aI/YdOczSZiN3G6pPLM92+QF0lu0\n8QRdu5cP9boRZMump1VZ79O4P+WF84DA/E5m8JYudVMLqmAfDEzcqObyWwf5\n+348xO1FIViRbmEm6gE5om249aWLhAFjDmuRJI1bpH98UrhUfN6+5V3kHuhN\nJbDjbYSyi+ahUk6R7P2JQt9hNxLG5bD/JaInlsi/6kZ9rVKhMhNnmIDtlqoP\nkBYQxatO+j2Bgbc37P5hIKE4nQPFZfb/en2NgyMhAnQlJuQDthcPiY5T1Apy\nxiDtWULbWyZ/mw2/iuykcl3rOgT9EikDxItIEXSMXrDf5beVLKKcbJVsxaG+\nKrdeqTMj5JLlNfZ7lxX97GHx1TuBOBoDWSCdo8bFAqFuGnI8Ex+Efw50JclO\nwRHW3I79fld85Q9i5SIWylrW+wwB/1SUM1mFYokAeNwZzTBrdJQohoktqtJM\nWgoTfjxBqyxvCeMAVtdrC4sjDAyFZuxDdbNGb6dHQK8dZy4ynJoFWMiaHccH\n8xtkPTVydyQxWQaViShA+4niSXN22AfbU0qxi1lQ5divIvbRsxk1KGzShkm9\nxcPC\r\n=agWO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFbqom7yYxnjmbYtgV4lF6p3Lwrjmbi9FgCQpGDKJ3OJAiA6x+xs9dBUucwDGKNEg9h4FzOwkQBWF241XgThdzg7PQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-up-master.20190524170605_1558717678200_0.1398393682142811"},"_hasShrinkwrap":false},"0.1.4-up-master.20190524175855":{"name":"@atomist/org-visualizer","version":"0.1.4-up-master.20190524175855","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190523231208","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9976673cc9d2c7d99591d6b9b1b5457881f7a8a0","_id":"@atomist/org-visualizer@0.1.4-up-master.20190524175855","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-+xXPQY1vVjGvw3Ayvra99H5T4z7pgx6Whu9Rxu605zx6vTKx26Gk9HDAydWkw7c1KXB/tkG2h+w1H41uosiH3A==","shasum":"4c0ed4b3beba12ef4997a72502c25d0694bfd290","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-up-master.20190524175855.tgz","fileCount":119,"unpackedSize":761051,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc6DFACRA9TVsSAnZWagAAiMUP/1X9u2R2HgkZBOYt3TZ9\nkitRc2pc0TeYepLn9xm7XNwNLgJ/MBHrzqKFPkTkC5XJgN1+11g5ukA3fIJS\nUtPojxm0DkXqii/+6wHkGMZd0GkI0Opn5E6UC/wgt0XOaVqiesqWDkHJue9E\nkGrf8zjFbUaCQ9mwJ/ZU/ljopKaaqvWsQWpaYSnFLH9IdfLoPei1bUhMklLj\nBhdRe9yTcmXHa1UXothkPGYik++TUrMzbhlZqsF5lE+iWh1edJvUtO3A47AT\nI3ePve+E7HqclnoCyWkbDLlvdzkY8KHPWoRbuNtEZ+QPpl9Z1fGS1UXPnDBD\nm7hvlmBjCKaw2BjjEvFiHO2Zs2xXYC2BR3z9YqqBCI+3iBN2ucK9+h5VveYa\nKcSR6U4qUfoinwvQ9gFNo9w179K51PeqZfvBwMpQYDcIBiUm/s7/5xQuhovs\npFRrVNqXxHGjrp6WT8Kkumkh7Lh0l3uJW/VM52jS2LozYJI2wwXorj8pxlIg\nNbVM7CF6NYL6DfbbnfAPGoAQDa+iFdLxvraU6AoxaWOUby/aGQmUW+BArt3V\njCiZCKR/pY5Y4lYYua4BQL/gisxzXv7QYdezmpyjwoOQb/DzXEIP/xY6eqxt\n6FrU96E6imU+Oe9acJCLNcrRQVOmTQPbNq1A5CVy00mHpj5vzhZ3G3d6PC2T\ne4bQ\r\n=tOff\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBk+6F9HldKDlHmWSxNpgW+YQytaeJJUFODuxplbJUK3AiEA6jMI145UxNXefhcRInVWHID5jTDIgkekpKWht0yPjT8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-up-master.20190524175855_1558720831968_0.22752111524977936"},"_hasShrinkwrap":false},"0.1.4-up-master.20190524183334":{"name":"@atomist/org-visualizer","version":"0.1.4-up-master.20190524183334","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190523231208","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2f7c728dacfcc5d6eee2c290a4ec8fd235c4a6f0","_id":"@atomist/org-visualizer@0.1.4-up-master.20190524183334","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-jdQhP3nn97nG9ctxk6maOJUimTt41V/hDjAG73qd1R7ngNZJYmaB1ri3QX6krhadBz/NGFlA0qfxADhT8yN44g==","shasum":"c7095707e2e122a568df68c14ecdcb8cfb11bc6e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-up-master.20190524183334.tgz","fileCount":119,"unpackedSize":760744,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc6DlcCRA9TVsSAnZWagAAlS0QAJcTco8Q8ML/3YlU2Z2u\n25Vp8KNFdYQhrRUTcEtaUDFsQbyD0jIMH7OuVIYpTqRAZS+q9jh6CA3CNBBN\ndjWwBV6CIEU0dVYMkrnH21684RIRRBsMJHKPhnkacUYHIodA9Lh+xFZoyHe/\npHGTQkyy+8zW6URj1Lz3Vuq43W70U59Ki2k3ISoi/X+isCoQEZP4n7pEB37P\nDYDCQ8H2qgch2GmengU/WDDvInYyhJf6WL9CRbzR9rIzwmjqebCq298N/wWt\nqGE95OPK35iTcYv7bSqHqnIhQNxKrgDIxpYKXd/fnadsLaIwjPB9JGAGmbS5\n9Pv4IjCZfbEnn7SOWjRCn25q/6B0OkgKHp6fcZObkEoYJcNpPzKh5RusJLJa\nwtlG0EUkIfiPZaM+BJv0jIvfykcU2jpyNrVNg+arrjcVuVDcvzjr5k5gVmYn\nWkPXSQfGkuv7fYb73DR5OIMS6KDaiXzWxeU6DtSoOKEwmT/94W6ySXUxbtk7\nc3enMsBXfFQXZAnlC+PrqsyzQbJTUVfuFNnJRiN5eiICspsFtxGprtAzgpc6\nfRHH57QMlp/N7Nu2gSbCVQYgwOiNHPm52g85hMfglNNXuQSkKkLXkeojO7nC\nxbGw1277uOiIiRG5rTSUi95QJlp+WhNKXQKWRJu4R2r8+QyK0H1nZs/Pq+e/\nWDyA\r\n=b3Ij\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDcFZFLc+rHzyS4+EwqWaspwqGCRH1KvKW4PIxQhCU71gIhAPIYg1xczm/Y5Nj0aUXI//LEBkQYYQelV9UZx0qgRuJo"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-up-master.20190524183334_1558722907302_0.47640715376531695"},"_hasShrinkwrap":false},"0.1.4-up-master.20190525174935":{"name":"@atomist/org-visualizer","version":"0.1.4-up-master.20190525174935","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190523231208","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3aa718c0473dfdcb0b854d177844e6e77e8adf5f","_id":"@atomist/org-visualizer@0.1.4-up-master.20190525174935","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-HSlAlgLJc1BiWPjMU65nbf+orkerNG/FhyahmvJPurxlE0H9Beic+zYu9Sk9LXy6PgZSy0mklSzUf2Uemxu25w==","shasum":"42b97f2095659ea6e7074331c59d222f9d223323","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-up-master.20190525174935.tgz","fileCount":131,"unpackedSize":767997,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc6YCyCRA9TVsSAnZWagAA0wQP/2AC4jMvje/IK50gDQC/\nzbDpRTPcavRLf7CSLCjl8CeneK09+3IxtTR5arLm0mDa1ui5igTJALABe4wL\nbtLQg59K1bGaTNUszI91auueKEycI4xvMSBfEYIb6ef3WvB6efDWAI9aH3CZ\ntC+FXKVEX8TknIDPWQbYFZbhrB3GQ/kWqTADGlVZoAMQu64dIlGLxxUFuP0H\nZaDn9YbXAqmHT6gmICiGwUfiyhAc74StNvLKoJwJFs3Y+aIvSO98hKqDrhtM\nbETTOFLQm1fqiqvaYKPp8Fe9Imo8C6M+XT12CS7I/tD1Ngjms6vogNgYOMAf\njmLOZ0AdAcpKXLZiYrOWOHswdcXi2SXwYMRIE53HD0Ke4bye4Wvq929MCrdF\nZZXSdTRhiUsL/mAoWleBSQsUjUMKbpft20NU7qw7neQCH3NGUCjCs5dEu07Z\n2xhhQ651ArFyuvU5+RudyQ/Sz0Iia+VI3HaBjmV01p++WTVDvyQTwhnTR48R\n9sDe+Js+ZVtO2oIUxvPH5eLeAD2LsdXrQHTJZM3fJMYhlBzIMpjZQ7S8w1PR\nE9JPdTspKebuq5/Q5DEQ4M3FlVp9T4pJkDgFaz9Sx0yL8axhs1Fo7E9C4Obl\n7Tz3F4rBopNldPZqc8TvdQuKjQ8z6/C6mFZfvYtaSKQYNT666REHd3q8CUJS\nn72W\r\n=GeNK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCYek87W1o+XOFZmR7K67rSBVoCxNEHMh12LyErFkMqgQIhAKQxHOAT5tnHWQk2dXG9SXiAui8y8o7bT4SsLS70cCiw"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-up-master.20190525174935_1558806706218_0.44686185335612216"},"_hasShrinkwrap":false},"0.1.4-up-master.20190525190013":{"name":"@atomist/org-visualizer","version":"0.1.4-up-master.20190525190013","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190523231208","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f4a302b0feafb16d2124eb233070ac4423317075","_id":"@atomist/org-visualizer@0.1.4-up-master.20190525190013","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-JDM7bAJB0Pa+a80Y8rMVXbI2ZoHbg55QSZbmKCmzc1qn5ouFlj1ROO7xs0b6+wSUnryQWuOHYBNvv4liAu+ZmQ==","shasum":"2b4d1aefd6b11ccf8887875bbf0c0c9947b704ef","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-up-master.20190525190013.tgz","fileCount":135,"unpackedSize":782911,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc6ZEWCRA9TVsSAnZWagAAK6sP/RJ4jvqPmxjE2ss1NRr4\nI8LfRHxvC4drwp6adXZOn0oeXj+sCPs/lIaGhr3g3evPC0rw766X77KJgWtU\nBzhiFjdMR2HpDjX/Qdm+0Po73RYSJDC/oA/R/p0/vA0HTqH3VG3aQXcksrQr\ngafDOK/4mP3zpHCHR02b0tTBZEohPz+zNp5yBg0mRxJJoNr9VusBWEAcxDmp\nAAChsEE0H4r4EPURDPe6y8H4H0XiT0GJy4GIfznKAkMkPKZXjUS2Y6ipcB2g\ninHFJ+vHxCuD126OPtkRe+FG2Q4/CsOr7w8ROO4Xypaa50EgVouC+EGet+zI\n2GCNmWXSmPScN4P7e9qjbtqmQHCP55ZDlqTSG/A1O/8bQflLK8Nodk237uf4\nHatWPdhVM13guAhJyJ4nbU7dD8A/ENv5JD80vgB95iyKWSgBlbHdZzO0YsYI\nqwwFpRBiYpCm+XLPOn94rlR1BVyURyIKCCduwoA1J9KM+vSKQDHL+Hxxm1XD\nx9BeFWvtJRg0Q/iPBkMbp/ivjfibqbCCgZPSZQDNsxJ0hNn4+I4Yt/vQ+y6O\nS60dRoJ1YUSuEClJbEDb/gmLV1DuKesBpbjManFhBfhctnNNyrVgi5roZfsA\nR2hLNaoKqq22bhKfPGY7inu3joOFZKh/Ow+0W32/RSOdKD2td/69+yiGPvUK\nX30J\r\n=DEZT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDkzBkUqMpKyITErrIY3d4cKwpJtp8+m79SUw5C0449FAiAQwOvH+++7WNt3fikHitCp1zLafGf9NFTlgyqKhz3r7Q=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-up-master.20190525190013_1558810901761_0.764576610726188"},"_hasShrinkwrap":false},"0.1.4-up-master.20190525190634":{"name":"@atomist/org-visualizer","version":"0.1.4-up-master.20190525190634","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-ideals-change-the-world.20190523231208","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker ports:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3f8c3fdcaac768580f1da46fca023f6123deed2e","_id":"@atomist/org-visualizer@0.1.4-up-master.20190525190634","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-PiWF9p/tRcSgUhMfkpCGLfw+kjAT8xFgiM0lBf3WYdxtPxScYuaZZxpESCAht5zClEXHFcsIEQ+nxKfsX79D+w==","shasum":"c1636baa75f47d400a3053e05cab31f2dd63a740","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-up-master.20190525190634.tgz","fileCount":135,"unpackedSize":782663,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc6ZKXCRA9TVsSAnZWagAAmbsP/R1yBbi3WPhSaJN15mpH\nE33zgvBK/ctLxfIp+KmoZJeRDI1CxX99pl+doQ+kDYxKvkhI8ZSt5bgpkkko\n+IADGuTkp4UAAe3sHqC842n1NFdvSpjhPYyVtz5vzTneaXwgY9/iLHVomV8q\n+tXZRP4UimKaNeubu3UI+ez0DvmalIde9gqjTJJm1TcP6FvWLAMEYTX9NUzW\nwnHXehOW6EWeZ8oBg//GpEBkQTHkqpU+XvbRgA3a84z/wCB0pdX/bxJSI5Yh\nFOoB4kb0Gz7GonYfpC8FB1aTOVeGZJ/GII1W6Wf0hCf3tVMnNdK2g8ih8P6P\nYUFgBykyIcyaYWHz/kQbIp5lvik98h43phkaqlpd8zGhMzt9FBSqgf0u0GmT\nUBMP+eiukcuGYei8ZgBT0mzssOQBnImBeR8X5RdyxGVNfFbGEqs0KfVVm+6k\nC76RO7zoDz7I6CV7UAGfk0IqISqt9avL8ih54awatkBJkCRIvrb4PVPDQgaW\nvNozDzHGlTFYvBTbJNxI5/miz/MRyEzmVdcj3FbdxeCgS/wrU/yQDLOzgzif\nhi8SlGRGH9oC51fEodfAdOf8ocLj6QBjMuK+Pd1jsNg/ljuvS4M/5rAfA6g/\nxyL/Oeyw8pcxRTiGnIAbescYSIFUyuKHnxKSvgbw4xdU3X90mZUU8305+Hte\nZyQ0\r\n=74bj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAFAtM0i9CBbQHE9rEwTzdG6OVs1OI/Xjvyv2zo90Jw6AiBSTog27X3Z2eGvHoDrEMYKeelCq7h69p80Aiy14vVx4w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-up-master.20190525190634_1558811287172_0.6492152162770344"},"_hasShrinkwrap":false},"0.1.4-up-master.20190527012117":{"name":"@atomist/org-visualizer","version":"0.1.4-up-master.20190527012117","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1f5132f435d760bed6eb47a72fe89ceb150a3fe6","_id":"@atomist/org-visualizer@0.1.4-up-master.20190527012117","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-IqnkP0FA0G9CLIizzzC7fjSN1iPdDxWdolpiPnmwXCme2nmsQJ4qEE0HNqm/cvOOmVbCS89l4ooEDR6qELKdgw==","shasum":"cf08f02e16b89f5fe38deac0df5cc95e9330c7c5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-up-master.20190527012117.tgz","fileCount":135,"unpackedSize":782647,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc6zwrCRA9TVsSAnZWagAA9bgP/RKr+RWcklaGRRhkbo4j\n7QJlpWuYDde3+jNYcIu84vzdzKHhb9YMu+Unwawc5tVHzcvWio6LnIvbHfGn\nbw2Jx3IKtNIlV1SPIYt8Uk5bpKOxKYu266BdGTHtSuZJh4Y5D5hAUzPe0rV0\nYK/8wykprlQNYCGt4G9Wa49VABC244Y22Rau3yXw2Arx+5hZKo0+n+mab+De\nC9mMmJ4qwJOQoECUPQENNenj5ovr53EbqgGdwTgD9yoAjN2KLivktE4o6FmK\n7BSBuKlGNodQxzYkrQL+BrwWRAzFMtw4vGRuY2gkYf+yY/Vkp6ln6txbH8+G\n58fCWGJDGyeGG9zkVCBe8qz8GsClDSaViW5F/JLIBiXfViLZKONYFh1jiZHY\nG8J3lgQy9Qu3cnYByD8xGb1BanFbdoRTD/M+OWL7kT1riQzkTsSJLEPdenxU\nuK7bnGzpRudMQ0kHJUmY0NgOstoaDJJGN4pfgqVOwak0A0NGbbjLx08YC9VK\ninBbIIqaxBagREbuRhgB99t4rrGQcs7uPBLH7DRSrIYKuOQgeZ0ykuWF+ZY0\nxg1hMYRECJTliKtDIOow0KEdWgGMgZTnMTj5N93conVfdN2f6cz2UilHNDKn\nXyhPwuIbwkQobZ/civLC+Sa0P6pUqwMiAeFXpu8KVqNnkSIvxUJlt1jQlZ68\nciH3\r\n=8YjX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCpDhrz2TarGyhPkLSSO/mtz69GErz0o/s2B0vpQBpyFwIgd2RWeknAZxhI564wVmUeksMI7BkPHmNpjR9oi4MBlaA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-up-master.20190527012117_1558920233967_0.4526567987055603"},"_hasShrinkwrap":false},"0.1.4-master.20190527191546":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190527191546","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4dbeb2fcd81e41285115673e4d83545fc12d7f1b","_id":"@atomist/org-visualizer@0.1.4-master.20190527191546","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-+12eedAAyI2XLi7tZZ9OgUfxIohdJ5MKzAR2i8KEZRssHT1WOtryd5E+AvHhpMQT6DkHYSjhxYkdc/WtGOMnGA==","shasum":"a3352cbf7bd5f2e9a39a27848600282ace3e8df1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190527191546.tgz","fileCount":140,"unpackedSize":793662,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7DflCRA9TVsSAnZWagAAKUcQAJ3dgv9DJLwttN9pdnkl\nYZrTX/75XCQ4KEFphXFvnn4FBU8A8WcSFQFwYMuC41UF4OB3TqyN84IgF9Qh\nrFLsDuHJqVtoGPRgw4AIeowOpUDVoF4HeWOTN4eKBRWp33wAUMIs7nFl6MG/\nZamjW7uDcaIw3GvZj9KHiJ5I1X4xvxP4hZVZuL990jSzho/HmAmthp72S3eO\nBepcaHgt5GxuW6gCr7WoJW4UAqWMKrIOPN1zPBYdnVYTjoY1YZb8OL95gude\nF2OYk/b7ajlSpgPY+RdLP4L4SCJL6E1AEdnszZYHO6kzQM45LbgRI6ueSf3J\nEvIegk9vFzjHLlDarhS2Cwz2WuT4aAbcPWz34Bwm7AJHj07Ydnb1xDEhthJq\nb0eJ6y2AHbHZYEB+UcgU4Ed+68AAyH67OroNKA1+lZ12g1QdBYsT5mBvPcT9\n7ZK4d/uGDYSBQpm6Yt/U8FU2FJfelAcHQnZDHeuGp2qO9CfPUoGwv0/GPOmL\n7jEfxF4wvvPBhxKsXnPH9OBaIZm2mgFKd46RlxOr9kDLLiEmG2PmpiGFyoXU\nfANeSUKKRo4PCmEpucNo08q0T6NbRr+mhgh6Kr4RyB5yPDxPZLoJ8WoPFl9T\nawvn6dyGAGAAN+PD1vErn1F56h7JxfpEUTKZui/A5Yo8XHhZ94HOynIPZOtt\nRrMx\r\n=L0d9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDDcptZg4hUJmkGbYcOXCDYlL7UYlrB+CTsPozXmSbJdAIhAOm1z4xZu6a5AafW3vHJNqoZvk0w5VsiuGWXA9wfIH5J"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190527191546_1558984675948_0.6462568669877338"},"_hasShrinkwrap":false},"0.1.4-master.20190527223944":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190527223944","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5122a5dbfd4a06a628832830aa4b30ef833d1271","_id":"@atomist/org-visualizer@0.1.4-master.20190527223944","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-t2aMUii4FL/c7z/8YvLO78tIIL5XJOs+Yv00F9ROFyBFjn/n2STC5tQ2a3VPsahQ21p3x81cH0EMbrncMn+iPg==","shasum":"9f2221ea8de1ff4778aec9bdc4076a98db950e62","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190527223944.tgz","fileCount":144,"unpackedSize":798342,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7Ge1CRA9TVsSAnZWagAAhtUQAJdN3B801kuY3zroFVx1\nuB4lqPx3wFz4MRxNoJc+Q81BCmoMeTt4AbTjr4Tqw0YevfQ/kZ6IETkpNNyK\n9kBeUWa3NB3T2ytYj6K4s+tr6us2o1G5HG3rnNE14rKdh9zHCNe/Dz7Upi/U\nlXFll/JnLPDi9580cWbrmmuFtW/5Sc08NDhELokHZAMAGTwBRqlf8T44JBCb\n7+1Y0AvKCLH386LVT3EN0eKi/vtW96gv1m92Res6aCylGbhriN/wdf6WIq9y\nemtwkeIspvjZKucJKGFwAHIR0RtnGVrSFInCaagCYtL2BhQjZIXEgW3uRfX/\nj4kOE3OpX6ohoh517CABhQ+bIpqhToEG6ViKivYjZMa3weIvgO9cD+zt5BER\nCnnqiy5KNE1ir+eodpDK2op/CyaNTvL+8cuRr614b8TetfY2MEUSCxma1qB9\nrXisN+5Qr8ID/LIuY2yhIO3ALiW0kunWueDnmI17JT10tFbj61hDSWBqm6S+\nwSOjTNWpF94NLH4SLfayUMYtYHY85dz7A9QhLjAgg1emptkms6Pc1fJSl+Ir\nB0Ip4gN+dxqslS/RxHyHQYpLK2uUYCx1kkZpQPc/XWq/5dsP7dh3VV6tbuo1\nsOzXdYn4dS3M5ntTz2L1024riNm+RECcovrc1zQtMldXZV9vZcaP1X/sdz2G\n0ILb\r\n=2FRq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBf+sW7LxkNzRtYN6rlgWuh+sj7MIgkmoWj8ZMp4dR6AIhAKd8ZKklYspCB4goGyeGjoe1vQ/jjdLZJirBeBtX9exQ"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190527223944_1558996916665_0.3449778617936272"},"_hasShrinkwrap":false},"0.1.4-master.20190527224915":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190527224915","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f017d6b244cc4cff6950ab10573e2500c2143c5c","_id":"@atomist/org-visualizer@0.1.4-master.20190527224915","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-bww2RBiChlvoYwWA0RKu38rfAu1xl1yAmi4EvUWYfaPHgDpSxjE8muvVWbuGq3xlY07RoIfKRc7yRgOYJvkB3Q==","shasum":"c0fe1246fe752afd731f1083d63c3a6008d28db9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190527224915.tgz","fileCount":133,"unpackedSize":787472,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7GneCRA9TVsSAnZWagAA5vsQAIfyg20BBKBT0e3zkKne\nC1dax42rx1esWBdi2cyOGJGOZMkA6Uxoju+5Brs+/9T2y2ssQ7mKKj22R/XH\ntGqLe6I3xgSHcrV+NECjpPBe133lu2BAUxlLjFardBYRw3L13+RB+3od6MqP\nMasl6GSA6QuZl8vbb2FmZ2x2/WzhAFla6IudtE/qSM/ceZ0CiyvsIpxhKkQB\nh+JnQxCj0YTqu7syXOZ+HvmiVhLYvd1fMVp7QGq1rqifcpWhg4Lfke5sFZE6\ns/DlQbx4YemsO80jMb2Jf7k0Ef5sYPM0d/ZnRWSMLkKh4XlGuhcz8nU6heib\nzeU5oHrkRxbPaxXwctHrNKiC47RY1ZanO5EahpW+xCHIsIoqK6xzAptxdvG7\n2rBWywnmawV6hJsZzoR52XU1QSqFj2sgDwu0amf+SOuduSjVRUezFmxm4sym\n3hiQ3dvRLhbxCUW8wg1FgZt6NEYIR8jCDVAeyxtn+HDqtDWQ5MEGDOc5pRqu\n/fJPEq3G7huTqpQEPlrl/JTJayyhEe99WUiECmRBSJ9fKSlEXF0WB1WPD4J5\nI9EJgi7qlLNPb58tdGNLe4XPawOlFLEEm/qqwIXvkKTJfmckfFxbyVsZygwS\ngXxavYDR3ciS6bcryG7LJxUO93z05RcSxavpUyOAJOxHwiDo581q3amEDhkd\nabP5\r\n=BZj4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHBA4s1m3DvLypB+MEr+OHcXcSj+i0j8fv3sDa7J2XyEAiEAwXJFRvAIGhPdI5JEreX1w5VZ5aElmbcR5+iWn5Hms18="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190527224915_1558997470134_0.6853390039077305"},"_hasShrinkwrap":false},"0.1.4-master.20190527232606":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190527232606","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"49ac70451dedc4192c05f7ca4851fd9ab9cbb27d","_id":"@atomist/org-visualizer@0.1.4-master.20190527232606","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-n2jP8sBjG1Wgxkygvk2UlQh2LHonE57ZuRVSbgZTpKa+fBa4tKbtSfY1+OY8LyDlgtv/eoQ99NZK9/LkBrsoAw==","shasum":"e1c04d8393fcad7433caf7595df09f35cef05553","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190527232606.tgz","fileCount":133,"unpackedSize":788783,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7HJlCRA9TVsSAnZWagAAlZkP/2KdHI7Fqt2lpM/8FsR6\n+5PjPYhfdqH6bhicbBdj/8ODdaQcsqhvFDj25V7MCs8xe3JlfaXbmU8BQqAR\nJBlfn5wYOwbk7tZCxF1r+Roy3rhCeLnTLiL2yBYwEWD4+Pn8DbyEPOaitazI\n5fPfhbHCyYal0wWH8WjLCjaFpH9hj9clWzHjl9sIvBgtCUfRU9BmLTSyMNJ2\n0sGW3ukAt7lOdINstFhYzRlc1s7VyP14TyUGEQYjA1V5DfukQMC49C7co+rG\ne5zbUqgIMrhl5uBNnSwUoXPUbAdi+vvkeQ/3xXk6KGpZPl7dfjN3LEq/Is4h\nOHJbUZkcA/Q5ZFN9HDah90PEyvPG4RtCrp8451pln3KPwWfS6pfDTFbQkenV\nLta1BnXVSEn54NlJG/Bc2XPvkgn4I+/oO6HrXkDlun32/YsaG+PULft7MlWM\n0RW+3Kl1+YknOa+cE1PqFQDL0gseaEM84HMUZUTfMQZ7++WVW65xJddedmfv\n/pc+lGSZD2juN7XmNyx+OOTTd8sDAmKyKUhitTudaaewYn3GPvw7jyaBXhRj\nLdxKLqwKZTyMFcqOCbi9zRxSp8bFX4VfDtdgeb+gIBPGNRe1ndzIN6VfisFE\nHujB7+cXvB4qNhvgU/CoM0aFJEZudvI4Dbu1CLrw2/eJ1q9/wVwL2V89kQR7\nOWXh\r\n=517u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHE4WEe1sEaRYZw3bi8MTGDsucwnQNgvn59daHtlYUBwIhANy3qc4KEekpj6+HBQAMeWPETpApdPXyE0OaXIydK9sh"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190527232606_1558999652714_0.4535266401217377"},"_hasShrinkwrap":false},"0.1.4-master.20190528192338":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190528192338","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"67fe960d7945cdd2240c2eee0b7a851951d0e8c2","_id":"@atomist/org-visualizer@0.1.4-master.20190528192338","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-fxafa1xwSK5jD9/ym4yVPiDepF57lWlKIVTJ56sW9FXunY58oVboR4tdBJuc1AP3Bbo8jbKFaAdElKXJN/ieMQ==","shasum":"fc44bb29ee0d4cadfe50be023accfadf4e2f99a1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190528192338.tgz","fileCount":133,"unpackedSize":784009,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7YsxCRA9TVsSAnZWagAA4KMP/2ZJj23Ag7YZMP8JuAjy\nTKJHMgBhuWeE+L7gQOPR+4LXZSlS7wRdBMN9YK8t04jyOY3t8ygINGme1myj\n/rQIUKw9LTU91USxvBol4mvYS7eVMGeQHyzfr9XHjmmOyycjnyJVAS4kaKbg\n1AGJyjGs63iL0uiN511bAyfHIbtTvoVsNNB5rZActxdIij6ygXGy/GOk8D0x\nthMVEf/PEdQ0+xTwF4LWlcyceUt6c2LgD/sBw5J5WE0nwVzP6HtzAfpcn+1J\n5Dw+Ox74DKosn4lW2ffeJc3bzdn5jlJAaI2kPH3xG5UX8B4QUsOyG3ios2qL\nK3BC+xcILqsa4ZsFDKqzsz2//EBTMTIGKPHhY8Rdb8LPAlpcoT8g84X2sy8X\nbe+6DG15PIr6Lg6qBYrJtU2tNgsduiA4jdL4DPbnz4coXA/SuXza/aNc4ZKC\nG7Gn9r6UeGmu58buAKmo6MAS3NlSbTc4D+9a07WfIV7NOl0UAKEz0RZf4HNk\nj0yAWHQ/E+kWeZEAToU9BjDNmRY3LviZl6L7SyHfs76Q8SpI3A/IJtu6o7A5\nxYXyXNoA36J3UTquVegYcKomrvnlPVsMWNUQs7z8dKNzG1N6WHnQ30C5Ur4V\n3w28bnex7mDWSzrfX88ezWMPpEPd1vPL6Vfcd0mRiB2saMvn9McP4spzcrp2\nG764\r\n=x/NI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDCOihFdJjce4tDjCVZBV3Z55qLbkFvIGlLhXCB3dMzcAIhALCDAnY8yKALd2y+XdTbcgohN7qeP/Oa+dMvQyp707PV"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190528192338_1559071536950_0.6072461105038753"},"_hasShrinkwrap":false},"0.1.4-master.20190528200132":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190528200132","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3e02223f09118b2583525259dbc573bbd1741802","_id":"@atomist/org-visualizer@0.1.4-master.20190528200132","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-1eexCR/2zpPSx8U3F8DHQJD3TCKf2KpU8RsHS/rRps48GFAHZ92IMfjS2hcy3wvm864yYU1GAwcI0XYAsXAdRA==","shasum":"a0f83b2be5c6a77611c7dd2d454c5da278a7b27a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190528200132.tgz","fileCount":133,"unpackedSize":788665,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7ZQUCRA9TVsSAnZWagAALd4P/0Kj0YKFUdCcrI+XPUZM\nc+GeUK9P+b86Ae5QrFp64lVoJNtKMEu/sF8RXItwIRvGIe0v3ptvK8oaVQzU\nwczq3k/kyqsRQLH+xGjqItWpfgE6YoTU/lz3hlkBmAHRTnE/rRiTyZwhkGNe\nCbOMntGIvVRhyAzavshijTTQP0pD7uI1kJaS9GAVxFfjL6QHiMCis4LK+jHZ\n4dhpyd/nsgCfq1O4AjP/axPmAnJzGWnERYOOHJ4cNAQNJ+L8nMiIdhRtb9Ux\nsqsIl+AqETT5MbjwHIi/ARk1EHDwiViWqk3/L9vhkJJAFPqGB8059r3PPdZ7\n7uIUYi+r+onCfJhL39O5EQR6eA0AFLmTFI7Z5O0AAGcpemeRXVlmqFBF8Wtt\nq4NXNnjUQ0q+0RN1j/Bc+AW3x8KUMtnNUR+M/VxDdAt52eBdhO/AePTUk0S/\nzVgzvK4HwxK4eQgO/9JpJW4pKLIX1hxKVEwKKx8lt+KLhbEpSzl+brH+QjY7\nh+VJ1jkr9spnSdwmwTnzfFSy1NMns6TOrtpw4shQRLx/L6aEPfLs8QUdqi9l\nRZ9QcNseaQ1c3thaXgo3i9GCcwG6n0sxIYHqSwxEBYLs3v3Hu+w3XJlkp1pD\nrs3eYIcU3jxiXn6+qa82bkHr03VQxlrWe8YrUVGnMlAUIgjXM94jAAoWcCFl\n49ac\r\n=ytFX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC0uoxnluYQFrVXwtCqkRGxtRaPuOQqtfqylGIVic0eIwIhAPf7p1E0g2V1fELpgyJv8H4teKfcax9NBoKZ7EHT+45g"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190528200132_1559073811167_0.6847808001467954"},"_hasShrinkwrap":false},"0.1.4-master.20190528234533":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190528234533","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9c84ae1c072d0eea2becb751ffeda1a1f500cbfc","_id":"@atomist/org-visualizer@0.1.4-master.20190528234533","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-xSoTNjdeqrdEkiDAs9S6Wv4i/eA+I0Bpv3JX6FiShlM6pszh2kP1n/iB0P0vho23+b4IfNO73N248aOlOKgM/Q==","shasum":"7e3d6009b830e264770303f94cf1cfd08dd643cc","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190528234533.tgz","fileCount":133,"unpackedSize":788919,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7ciECRA9TVsSAnZWagAAn7IP+wf79FHMDOcQxatxIBE3\nCYsJBvVDuOnGi1kGXoQkrSFx4ta4MPPSHFoEhiCkWvmgVB/fxwcECgaadLcc\nt2HZGDW0N+AqD8qVcgX87iT1GmJ52xr67ghB6c3lQeRUQnsKXGVzTVK6zqhA\n6xdTMIDWA263bvjJE89RbJLQmAGuDwtMen+h18cTp6qEYuTSzGTEhtiGQqOX\nzXgkjcXtz0Gv3OEdVVX1E+mgp0m6Q6cSKDARVxDYf/ukb1wJMQxSxe2fKv9x\nyEBsEBdjXagGQWce7trOKeV+VaiWb3a9irJxQvoOwmWbEzPSPKUY4NzNq9aV\nxEfb8NWM5B/jIGPJNEEOL6KdwDJI3Vvtr9OZyxySsy1ypkSaz7UUCGMTf8FH\n26dgwYqeZjpGnLZHs98P8g2wCC6rhlbzFjgCk7/iLcn0ojeK1R7G9ZF0ntqh\nZDLNqx84Zro/Xt5Ty8/5x9TAjT0krR0wjudulrnmjLISPBgGbFkyc2BZdfxG\nCYz6Pq486nh45mS1ecGI7s3tcY0FgDc4f+LrSXoM8qYtMwsU09nfNcjV8aBg\nzQKrXR3zYPtCj3Aa2CuGaSUtf0PtXbC8OZsYUB1FBqQbouFnzX4IWTC9jC8N\nNrOsEh56rFVr3FCSom1Gmxf4uYcmnGbhoSSlNM805Kxfv2J8zrMo3WS0KwYI\nddx5\r\n=evGG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDKiRXg79i61UZgaF+ztai8WQmliqFDjicpodHDnxdgQAIhALsAI/dUMR2JErwqJQxrhrBrTJ4lTV1vzPiXKzUj1bLA"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190528234533_1559087235354_0.2135073277637065"},"_hasShrinkwrap":false},"0.1.4-master.20190529001507":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190529001507","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d8fe91657c9c3b189733d8770a2aac9bd6cc6332","_id":"@atomist/org-visualizer@0.1.4-master.20190529001507","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-5krcK1nPHMNsg9GHDCBuPPk4egv6abdvFvGHYu+1iZD80+e4YBPNYLFWJAqhe/jxG3udCpMR8y2P2wxFwIucOg==","shasum":"d03935ce4548e35cee6b9ff15dd336b383359783","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190529001507.tgz","fileCount":133,"unpackedSize":789585,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7c+CCRA9TVsSAnZWagAAbbkP/RlI6NG4F0uG9BqS8pm1\nGkg1u7PZcuIXbqq7g0zXbpn9JLPpA4Jt8ueBkvN9RW9LSSIsYiS5w8dZg/4D\nA/4TidjMhzUoWnuDOkYnpvwQvmJAtzyNWAHqF1t1A27n6fRbMkz6LqlV+vpK\nWn3XOi+UoZr9wpa9choQy9jX0jjbrZbDyoH9xz3xnsAgr0bbXO4jWza4UIHM\nxsugdzvdYDdsbVx0TRK5NQbyVhuKowHZdAKewYx3RtXxxAJDnTdoKQ7w0dwB\nevApy59nMoSzHTZrWMMxu5cGMp2ys7eVefyxSC36hPh3p5quO5FeqoQPtNS/\nFq+1BB+twIID8L9//+sEDbPK+zlaADhgjozjgAwoqMzRieEn13YGz+Aepy7K\nUh0C19R6qMIhgYuZ1SoZU4TN1ntk1wkPTbF7eQvtvG7OChqKAhHnz8CbmbGi\n+noH3Fm3DUCqfoiL2f4KU3rknQT9jqw/mg0vehL/YQUW7ASaaYCqHpkGj+2W\n43iabnA3kuxkZvojnpPUk+o5SjMk+MT9WtqfMhuz72noRld+T1SJhGpV0rk1\nCq94krYUDxZST6Gh1G5+xk0sgWu34oilEfuaX0YPm876BMewgbDFvVCNmRCF\nvBGNfsDLpal2MSWJrusI3QahVdBRMi2tz72JQMP/b3z+Y8WlHrqn+Iai7Llz\nwClE\r\n=0d7a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD6LgCObo7BkEpMVM5TJo4m6g3s4zUtWuRVADJfVAmxQQIhAKozTAvAE+1uoFuD+9Q2EbPSj+ZMsY+WPokbaxi2Frpd"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190529001507_1559089025376_0.5381490485085223"},"_hasShrinkwrap":false},"0.1.4-master.20190529005259":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190529005259","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0b2c59151875b8b95734435d09e0303db5b4d506","_id":"@atomist/org-visualizer@0.1.4-master.20190529005259","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-3WDuDAGTTb2o0ltA93aG3ashy7vbJ3IzA/QbelWcV80njcdrNTSP8H+Qj7QgMG+9VwaWhUdweY1iADcWCMl6pQ==","shasum":"cc1d26faab17cd9bccca8e1ddafbb60150e8e917","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190529005259.tgz","fileCount":133,"unpackedSize":789106,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7dhjCRA9TVsSAnZWagAAqDAP/15IQqW0VRmH8Oh3IwnO\npRR8PcHER99wILu9jWGjXL6tDwg515yx62oPdEz9IscdFDoMyGvQleo3o4fk\nWiF7E7w19kYfsfSWeq5ipB0P7cMMWpezljxZZh3sfmBJd9hYvv2o68Taq+eM\nZFHwsMucJ1k1R2oAcNW1hyi39vz28rY6hyO5IVTOegnW1Bf0jTlI4BUBYxNQ\nxR5RmiT536g90PQQ2Cky1lbvITtalBrpC0yQbHhTVEWWVcrnU20b+7RqJfzg\nL/qHztoF368iJHWkyPviQT52xDGyPcIrC3HPycukYIWRsmEM+8HonkZZhcuM\nMyqkVTE24qDkRv2Kq05ni+WNRx/N1WNW2Y6X7cX/R+Wkj3xA3LIy4dXNthpr\nwXtZtSpQigHuBrgLdRfW8rpDhIEnG3NFpeyP4eEiN3uWDbYJcmdTUroL5XNn\n2DZv4myFSTpfcAsosfRoQ9fkVMPe+0k84hdzexK8uhrlikpBY2+bc0ws8nm9\nBmFribe/IIyXw2Z7fwyC7JTHd+CZYDV7u3oXhhP1ZlazrT5xy2eED9qF5Kze\nyLIDd7MPNqCqUCRr138mQVQMNyaAE/vMwWHVU+Q7fa8lYWEZbDKamCH8zRa0\nddbcqripGORqrf+tTcGb74ZAPw4rTMCPhNNM0ooVOlpr40/DSynV8oUiUoLb\nSkmj\r\n=cEod\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCEHgvEm6JUj+hIlDvMNobSTnXRJNrb+Inlz4ze3TaJXgIgcBfga9yT2lwVgkRMTSYkfvpsJyqvmZ3qAt3p/v3UFeY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190529005259_1559091298521_0.5675331484687272"},"_hasShrinkwrap":false},"0.1.4-master.20190530065329":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190530065329","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"735958d53046add60dd4e801763c335c6338d039","_id":"@atomist/org-visualizer@0.1.4-master.20190530065329","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-USMKpcgrsYBFBlZsp9dZP0VhWZYxMA5jDEdba2NEQVDmKxNhcAQftsoVPFVWfM+5Fy6tBsLyoVtCmfoDn4hmAw==","shasum":"cd47f5b6b0b334e81d4202444914f688bc1f70e1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190530065329.tgz","fileCount":133,"unpackedSize":790801,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc737UCRA9TVsSAnZWagAAeO4P+wVF5tdQJqmf0nSts99T\nvQM6K6PkRzq8Eqaa2rdvi+xuB6N92bEchiSr8TL39VoNyO7WHwAdDcPdOdmt\n55FSDy7vqr3oiB8g4r8+gAxpf6ST77dyKVhC7Zb3R738IUO/DY3yJpx31WF3\n/yUKcgsYxMN55NRTTcl/zAPZarpsYBgXopMOkvRwCcVLBcemCoaslXTRFw0a\nW8UWQ1G5tnkLgxnNOLz3G3m6kAFoSMrlwdiWe16WGf+RSu/XdLd/s59plwa4\nz9AwF2MHwrywFzt5bln7i+R7nNO28KI1cyfmPYOIOmuwO5Jl+l6UJVWWz+0t\nozT6pkMHdZpMN24yYmWYClL9KMye42f5cIEnmRGkQt2qAmerafNg97aL7UFt\n4avMlTdnl4K0Y0nGND5c90BrilATCFqHHlAaSzAwcRQdOaZItf9TbC/vyTrb\nRuTdwU/TDdVFGkLOPJAjifsvOBeufKu8ZaQrIcfan+9X0cmsQwghnh7QBHV+\nc8+TCe6azSmqlBYJa/6taJe++AfYFxexmKOo7ll6pvX8QVnZRkbxmC4aPEjZ\nz7eXoseH2SGOnT4Or4tShooRXBZA+h9wdDF6HVOuy2Y4C5S2Dp/PMkfwBJEN\nBPMgfPGtSWEPXrjhQTnQtSzBcd97k7VxehuYJmLtkaCZW70g6z9N30Sp93qP\n4hy1\r\n=0jNG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGO1Jbj+iBTJYw0HdyCUf0Mvr4XuNyhLnWPUV6ryCpy5AiEAmyFB+fGwSUBsIpQKC3eCjzV60xiR9PQ4GFMk/plI/ZU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190530065329_1559199443546_0.6801269142396071"},"_hasShrinkwrap":false},"0.1.4-master.20190530071209":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190530071209","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8573b40d98969c44a38cefeb66951a6052c52efc","_id":"@atomist/org-visualizer@0.1.4-master.20190530071209","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-PR4PBYvSLqyuKrtVYfOXF3SZNoP+IBAfaKRd64MFg7e8jhMMvqF2ngxPjIzF7Wi9ChEreTyVA5etUwPFlkdUvQ==","shasum":"134479a0ce0841cb0749961dea25633608f28d6d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190530071209.tgz","fileCount":133,"unpackedSize":792548,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc74K6CRA9TVsSAnZWagAAAzgP/2jgEifrhQ9vepsoqpeK\nLECOVIVoptX7bwDBiSJl0v5RyhpvaEkQxgiUh/povgiXQHTfrmFgOR31o/U4\nzXkHFwmzAaSrANLNdfQk3n1/coKMcB7yz367ZC7lkbxOYK57cRAf+tazQVyy\n7eVec7ZEhwVOQ90FE0efKFZXihb6T83hphIsj3wQlHs/RLKVFP5hApRuciJc\n0E5QpaFnNHllhD3iSZ0Lj4VF6QmD/LfUfzrhLNhzjf5RpXsH6g89RrvZT0fe\ntIw3uogQZt06wo9v+2fZAne1WJNs/V55TaklUDyJ4tX/efB29tpIHC/OGtfA\ndicnjZg7esWRQeRjWE8KscwH8U8TSdYPuOek/fgCa6WNfs4eP6idbHX2nLVI\nro1id+FeJTkckt7J2oeqdDWVJu8Gcoj+4VhoKbIj29IRP4lZo8EhAEKflCFX\n91hGXR0PWpO3i4OrWgZgco7fV8ycrwfEYGMGU8QrH/NEWZ1g99z7Hz8ygV70\nabXlD8iKtOIV2y6p35Ws8s843we/crfO0HGOIqA40Tg97K7ZlL5jOrnd4Zfs\nHO77JnB6VPpcn5A3JZhKeUbTjAZEqpx5gnE2MJikgvI8UfH3503q8PumeldV\n8wkZjuZLKklBcNdYFBzfYfbr4Oh/iUsR5ipQgIo6NzF+7XZwGqHlLJg3Z/i2\ngh1U\r\n=OsSm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDrbd+SI+hPaP4puP8xdkeBR97kicFVwKpLzogxxrJ6OAiA6GD0nnbLutpHcwFMShcHgO47zExrtAnb/acrcEYd3yw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190530071209_1559200441513_0.08242741397477915"},"_hasShrinkwrap":false},"0.1.4-master.20190530082559":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190530082559","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6a55d93435982773bfa79ad47080c80e3a65875a","_id":"@atomist/org-visualizer@0.1.4-master.20190530082559","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-qtba9j1WLiD8DVTb0XMJ8UwyuXtthQkVrwe6v+9ydImzeB0gGgkOMqouUKNInClU6Y6rD/Uw5ra9Md8U8lp0xA==","shasum":"e04721f364ad1e29f9a5d50ab2704ad42d697295","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190530082559.tgz","fileCount":133,"unpackedSize":793514,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc75RXCRA9TVsSAnZWagAAerIP/AlVV1ydAb+A0u1JL5c6\nCwBgTrz1+7W+iDJr8WsIAhcXlZ9C7Eiq56ZyEhfGvxqk+Os9kzNU0l8Y73e4\nHLaIz4IXJJKBrobSsxRPS7PhPmzox4VZkFBm6BXNej4pJA4XHSk9u11/aGFB\nN+W6ak8HMDSL8nEqq3s7VrJxxv3iYZVAS0DS1Y+YQnU5FSPGJdYtj70z+fd8\nhaZICJI0fsGn3FbeLgR4A4aipldbpEoj5QF2uyvli7CxxW5lRfx5X+ujTXUu\npKJ8YKMn9T7DPZBKoR6ChSi46WSCV1eFUtFkdU/uSTdVpunxpiOhr/sFhOLE\nFUNi+dH3rWNxMlKM9yc8g71G0k3pAwyp3CPlh0UMztxUlm008YauxtpXVyB0\nlSHUfri1iOAhImBE5gdCV/uS7pjEp9LHsI50N/lxGRc3XwkqmuixEWzMhGBF\n2TNwUjsxyGjvXDhqk06eQcpVrQRc229TobNbvsbu0ww0LWHebxBb0ist/1+t\nEI2bHaynxZSjjV5IFZS27wShhe/+0Fcs4fM1/op7c4yrX2l29qFJrSR1fguy\ngAgyum0vqPPwarCRQ7IgnsMTQfdKtcpCvhcvG5TJE4CgurYxMImg8Heqibgx\nzTed2dJKQ1IS4orcQsIyxs6EvZBoppDilfK1YClfOpGLP5CfQUXkp7nTEX/Y\ns6dj\r\n=nEQS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDcbJ58crnecwDkbPbZjvd0QKg6Mi857A2gOajHfSNT/gIgHCO+gqbtXx3vvuZCL4jlvk5TovIBm2F5eiE6opTQUXM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190530082559_1559204950337_0.48444782246535434"},"_hasShrinkwrap":false},"0.1.4-master.20190530084918":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190530084918","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"593b3b42fcf0f79cb4401a49ddca5e85d87c6103","_id":"@atomist/org-visualizer@0.1.4-master.20190530084918","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-C7p+91hn49QT6ZxqSfHJCqiNGq85EDTQYAWl0OQ9gnJHj9ry/dpcdwFa6m99d/3RqAs2VvNFjU1mAfDRy3fqpA==","shasum":"18cfd7ebbd9aba971b1ae334e90880ef29a3f16b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190530084918.tgz","fileCount":133,"unpackedSize":797165,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc75mDCRA9TVsSAnZWagAAmrsQAJhfwh6Gwg7TgC04fl8a\noCHnrqGXPUb6dKAJ2HQhvKYWgvIpwAFhSGXl80zN5L7JrrDBvGNYVj0YudPD\nzezBBYlz0DiWyWQbaEoO8k2aELQeEKAg018sZAGsPS7gBELO5i8044WwOfbk\nP+qY/0PSWW08UbSapXsmBIlN7HxAikxPc6QXVySJql7fusy84Eq9gEwnwvP2\n+kubQ7Mb6B+AV3OIUBKQM9RanTbg8GN4l0cd8WoMqhEMP+wH7NUs6M06lzsk\nuDnpO1f0EEoCYW0e0/6GCgb5uNxymbvsmS3QIS1qzfyCUCwFReJmpA3yafBd\nesOPLUiSBu6+nwjluB4TnB6AUd9QjhGj16sVdaZ1T5JSAyb2j9ZuoSkgP3gq\nKsI3fqOWswhmMX5zic9LTzuZM7Zn23Jq8RkbCKta3zFuf49Ra/U02Gwyw/rw\nXo0yozCHMlY5Kz3MHPwW5EdqAnQKeIh6iou7fvBo93eG8ZYkzPQxf1SuUUFW\nxuFOHoINoQ3zsV2MpJ0Sfev0H3Ji++z5hD3rfpuYqWLvyvuiNmuov4uOI9h7\nCpetyt7sdP6sOS3Db9kQJo5hKH7cSUInI4rtt0flyMbwP5thl1DX9IZ//tk/\nT82opAUaO7rjoP42udvY60hF5DBA2hSMmBH+/UElpjFEHrnSNnYPM+yIJPlv\nTDEv\r\n=ac18\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDHV5Pq63ZV820uM94EaaPe20UzA831xPPWkNWn39mM/wIgMAvpGm9cn67c9DA11q3LFH6sG6+29dcMSmDEs4BOn9s="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190530084918_1559206274490_0.8977643294615538"},"_hasShrinkwrap":false},"0.1.4-master.20190531104250":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190531104250","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2e1c45b27a8efec385f0d6f57b211ee3a2a56a9e","_id":"@atomist/org-visualizer@0.1.4-master.20190531104250","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-gx/UHJ+5mEqTqBaVRX7FP4mRLtdCNHZiXoouZc9ss+VZEOBddtaBEXYIJ5fyoJ6X8lsWVCaU/ELaB0sWzZ0/Iw==","shasum":"19cac2aec434657c00de2228840468f34d827f12","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190531104250.tgz","fileCount":133,"unpackedSize":811975,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc8QXHCRA9TVsSAnZWagAAWj0QAKDbhu3ycg2cBQAa7k/V\nobfsThdLF1tG7nbzI7NZ2wVpZVTRxDIz5tWJHnqeqBHGDiIhfhwzZcRq/7BG\nn4onTUpHLvg4yCig0G9wusf8H65ihGJ/OeI8HFxq+2XNnPEOFweoEKSPqo5I\ndBWV/VwS4DviyX3WSQh5GDezRqghMXYbWJjHFqdobbFgRcTZztDnNntIiK9f\nBNMFbT0TvbPc4MdEXSreX4trQoZi60AYIbNkBiANc+ecdzo+UHu6sM5zeQH0\nG/FDvUIbajWeS1SNYJqhcglkwx00jXDD7Fdi46WENdqlx6lk1hGuYtGxg86R\nh/qcVegkF+VqCjyNY6hf7ReOlpKvGkZKo2I8XiWAm3F8C7sYigg/ueK6QRcF\nZvfp147ZwYt2KzgI7oxo1JRLf6ZVg2GZPe8Y+uouZDigm08c8Vjqv5/zKy8x\nnyzbl/wV3wJhEx+/K1QEHFdAEzzxI1AXy7VJrVqj2ALRL6Mrn5TMf8SaNGxX\nN0f2i+4ytI/ioi3Ws85HfLz+iRrbZxQnYOI83ZUVHCjZmBMssg9W9g56O/Mi\nL/F2PD6nS8h6fYcYTnUXojF2DLQMyQfi+RU37GodcDPdUzv8+G5yXk7g5cIq\nJXyxMYLX+EbVFZcdNciF3M03wj1cm1sP631AQTcUtT6LhoS5aIA3xC9SE/Aj\nSSxY\r\n=jhZy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYUm2aAEQbwcDZzWCqdZ38PpJQ92DIYD5wDCKY1o9bBAIgLGxio1uOxHjPybVgi2rLHRw/jPCGhyJKkIoPPh717us="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190531104250_1559299526800_0.07384223519539868"},"_hasShrinkwrap":false},"0.1.4-master.20190601062850":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190601062850","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"36ee716cd70b806b6e8709e4f603e0d00f981637","_id":"@atomist/org-visualizer@0.1.4-master.20190601062850","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-w/P5CJ8di32b0/+Qyv2I4CY3PHcSvrQ/kNwsYTT7Z6Luon3mOu36Whb8051paIf+BAT1HQW7uEAifcbWJ/720Q==","shasum":"946f1e3960ce6ff16203e88b59acc520b4a2fdbb","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190601062850.tgz","fileCount":139,"unpackedSize":820755,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc8huECRA9TVsSAnZWagAA4oIQAJcdpj5avlXcN7F6uro/\nZYnzSfxLhuEDo2iVGOC0p4P4lx7lkZsFMajH9DoNh/+Klfu1n9syB2oUStb8\nGNfBnSK3wRlnQGujYTmYrgifQT1UQy1AchPit6i0YfHPqsG9+CwvK79y8TX+\nRVs6fvFBeqghgJ+Xx6SZdh/nm6I9TM/7whxyssgNbxkhac/FUiawNZVWN5JU\n8r3TQcSqOuBuHWgz9vo+WYNfkYa+n8Xj/tCWzH01DsTyugCY6KvXunZq6WUl\nyq3GGCyrGVho01e1P2s55hEv3rgIW67ri1ezDzp2hkcq3zx967jT2pO4OVrW\ne31qMhcxLUX0S/ILxIioYfTcOANlew0Wu4Z5GUIdXPzI3wsrx4k/eJz74+yD\n20ZFMs0eRjokpqpaef1YcV824buAQa8IvQvkaJKluRhAx1ApL87LLwvmxIpT\nXR+r5mO8tIaJC0eHLxJIG/QbUAorGJR+InclBeVy6eafQO9kwGb4gPWpR7EV\nqYwv/fvFx6XKVGw5e1SnyzU4Rip3xoQhBUmggEIpnxVHKU1D7CNwdi9K+SMv\nb3zl7CLUMWvDC84H4CubhBBECkNNP4rkwRtaczwninN1b8tBjKVf+p8D6qRZ\n6Qa31FHXuFbap6eFx34AfvQCLGrJBfZTUNT3uQ5VnFH5tzIKOjIemu4dbon/\n3czY\r\n=35Oe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQPXXOF9j10rCIzPHNvyJBaRB/0b38C8fb3BGrQbRs5QIgIou9+tz3wtSO2UXkN3wTGD0gDov6e6VO3JqAKaGphcM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190601062850_1559370627383_0.05785875899401827"},"_hasShrinkwrap":false},"0.1.4-master.20190601064115":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190601064115","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"06245035d7a174b5c0c9f5f1b92a62dfb143e77a","_id":"@atomist/org-visualizer@0.1.4-master.20190601064115","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Gj9vVD0Bd7WZ8970MpZw7EAk6AejLvjENNgrU+lAivLYqGvId0FfEKPxUDtyv3KrBoZ2fqhrU5tCDcvysw2szw==","shasum":"000f001c039ee0c1f82329ef55381208ac69ca3f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190601064115.tgz","fileCount":139,"unpackedSize":822172,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc8h6BCRA9TVsSAnZWagAAT1IP/ArWPxS527OSyDUoxTRg\nf1TchGLllUgRSKaaviDH6F0mxIxyixqi1wXtVS+eIu9DsvqXLGFpRRgeeqrK\nILdmY3VSuBOZxJiWhLfFDFWcRbXWqG1u3PYcc4mA5BthyHmmtBNlp80LOCF+\nX9ha3Bp3toaJn9C6DZKopy8Sdc+Qzk5kjxnZP6+zOYsc1stTmN3nJ/0JW5gp\nHq0ZHEekEUQPQSxWlsUu6H06ceSzC8T3+577b5e1JQlLbJwGNNsF+N8EP4z5\nMHhW8Hlw4+GZn0qfm5LP03mmdkWQBuhHvCc1G4nuLPyGJtb6yUj2+zJVx/z2\nz+WygY29SdotbAvCPD00buoXtMpaQ1coM6jqFT1NqndrSXEHuIHGfr7+8/gh\n2LjSvsFJivQ6oDXwBWwZi6jMgDh8N2gNZiFtKt5nXthYp7ahlvHAmVrwhAMU\n51FjghybVQXvS0J8EtfP2PNWUOSbC8IBNwaDSGNsE+ux2wPLuZnKNzTMav0g\nDcmr5GRGs4Zcdms00Gbdwdmg3GcoPsq1WhFyDkv63cbE8kjbhB7dcbLlFzsr\nKVkUmDIN0r1DXkGgxNl18kcaE/0eAlxVppUS9a+De2jL6MWh6mXUBjZ8DfFb\nSe9q0BFLCzhqm9fFLN0aykrlbiGEOffzgVQq8JN2T9rNo8pRzRCicJiRGXfZ\nQc0x\r\n=iHiR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFLBYYegwiygvV4QFdq24+YFcRWOvYzSWVhuV2ZlvSgwAiEA2zJjdFyGZ+Z9x8KamoX836gufm8J80mUKtxGIygxzr8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190601064115_1559371393136_0.875812147448549"},"_hasShrinkwrap":false},"0.1.4-master.20190601075952":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190601075952","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"246e37bf21d226b4d1578702bbb6263261c4e85a","_id":"@atomist/org-visualizer@0.1.4-master.20190601075952","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-2DFvLHCouQdpZAQ+pVJqVqu68mi4z0ESUv4WRoODZST+A3ZjJ1U58wecQi4agrw74onMDAkZ2GZJuFZpc2PWKw==","shasum":"ba0ebec074db97950565427d768f29bb6519edec","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190601075952.tgz","fileCount":139,"unpackedSize":826734,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc8jEmCRA9TVsSAnZWagAArigP/0H393UKP5txSv7fz2Ee\nfFWCVVqnimkC8bTNurK3rlMAq8pTZQDXzQRImL7ife/rDZVzJKgwTpll/3J0\nZAY3yTanPo3OzTljFmvbHfD+ZnIcGoz0DL+zcCC2puRWV0+g4EaPkcdzAo4i\nBfIMhOADdthmAcWVNAEMWR993Qwgha5MMWa9D+RBHehK0ouu/RanAjy52XEk\n5UPxI9PylM7OBrZ1m8zGJsHERCG/4H2MJxHiS0JBQW1SadBpk2tdRYUcw3z6\n/XQftCBRK+smQy8B7Rg4SksHOUVAWqGaBgJMohCuGvd6ZcZB3hAA2W+aiLh8\n17GlHzNaaIfvQ20oKgYFMMCTltU2nRp1F4yXBeA8pHDZu6OyB2HhuM8z2Ck0\nzbph1dNZFJ0aMhd+LDdLMPhonq4OnUO/UO7xMEoCI3Bm7QNk20V361O65P4/\nD9+WqjXoq0t0TI9TMlgv/31ob9ZgrO/0yfKdJWPyvTL7m8Q2Km9qNGfOsamR\nn5F2td7dXTY8DeL1zCCXTC+L7l2PDQoirC7OO/pXx4/Sa0xvOXTEPHFoEYB3\n7lhWMvV0my5TTId9S/QeTkoyP9wehu0dOgSIQuKjb9GuF/RizGzNvTr2fYWl\nhGZ39iVLh5LfDCCsqzclI0LUsL5uA8cyNPHdkosexSal7pcdX6nWPFugCk5S\nud9F\r\n=s/te\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD6BTItd+zw/BcNWl3IFm1Ej1FNDPu/arFeWJSdYrZEHwIhALzbzw6wLrMjpHhfV6FqMiBzAjgF5nxFVXoqrX6z1GSg"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190601075952_1559376165668_0.2903664455391073"},"_hasShrinkwrap":false},"0.1.4-master.20190603083127":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190603083127","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a91b57b9509fb03fce88dd3468eb98ca2589d7a7","_id":"@atomist/org-visualizer@0.1.4-master.20190603083127","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-78dBsE1ZUIJw0xEY3PCKP5zOq6nIrdLQIUaX+0XFBij7rUD2/a4q/qFBNyLcK2X2H0S0MCJjtBwhG0ePa+cnEA==","shasum":"f0aac861c5c83589775a2b1c446f3a5b692acd41","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190603083127.tgz","fileCount":139,"unpackedSize":834193,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9Nt7CRA9TVsSAnZWagAA4vIQAIk90GD7phHocTmQCEO7\n2f2yw1by4EjZZ26TJSDT86EdgkegTYbq4Bf5QTY0DbEmqby032s5An3XuEZK\ntUSMMLHsB7bOIp+qN9HUnSZGR9WUS8bq44UJOsNUkkDZ2njHyx2b4Y3uMBdk\nIsyFWoGCb/HqBLgd85z7+WiJvFntWUI6WijWvml3ZKg9UYi2XGMCwiZNRaH/\nk0Z4w4+ubeok+GyuvFoyEMU9gJ0yCozFXNtrY8IKWO3bq2Uukr7+kPoAainV\ntk0k2L/9Nwa482L2BuasnznPwH6xQ008tIXLk4r6RtXkC5DNf2xbUc1yiPb0\n1J0/VHwbUsoEPv3+xfPsMHkf96BCkToGksKiFGwvg/RkHiB3L6ziqCvW14jF\ndhBhKpiM1nA2V4q62pfEOqJymR2xq+/PK9f1MtYmijP+JIdCy2gEfjA2absW\nGh4+h/WYTv0e/UqugkIzyzkhheUMXrCFWoRgdqUjoVJbh9Zf0qSENoFrWksF\nihwblCitQ5CoGxh4AYeDHCoKT5a3UXRCJOnkuJMFn/61CGuRxr6GCEsAS21/\nlMirkzyMVqe9a3E07XkPU2/SWDM5hBIzUR1MUOZ0M2tdSPBLCBhalVIP+NK6\n+RHTMGMM6yQfNKnv/TvMK6xSuVqtEz/FHP5ufnMdFSgfKfVZDEYccWNa4wh1\nkGUr\r\n=ZpFQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCilYNEedDK987ik2bdW1gQjzlqOu+n34wS9OYE0bI6oQIhAI3DaRV6nwuWcS0a4kkVq3xOVQbwbwXIDk08YIG9D5kg"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190603083127_1559550842302_0.7392674934201084"},"_hasShrinkwrap":false},"0.1.4-master.20190603234122":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190603234122","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"72dfd52b286b3c5121c113d38a451d178ef6b32a","_id":"@atomist/org-visualizer@0.1.4-master.20190603234122","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-4S0HBQbUBZlKu24ZAjVj4pnc6BiQmThHI5+f1NwVgdBNK+k+ayaSzg8om7W9nYf97yQiQAt3EX0g6pc/lsGVcA==","shasum":"4973b109a5cecad81dc2a3ebc7c5fd043ef3c0fe","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190603234122.tgz","fileCount":139,"unpackedSize":834298,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9bDgCRA9TVsSAnZWagAAUugP/3ojUTxLSejdV+LF6/uM\nnw23M+qRZJJ9TS8p8okyera+aM2tm/u2RjijmyVHXJphb6WIBSmD9oFrb3ZU\n8m+Xf9LdUkL1NqKLF/ypyBV0aFlw7X6Fy+SbpuA82avfdahv7QXr1mNcJhOl\nVIq8wGIjd2yitVoWNWqlR0stuY4qes0t1Q6Qz3zPP9lHqTsfjalvM+J5y85k\npEaB1aCqjCY453NnicCgCk4s6dHWGLiep4laH/e7Mn556XD1Q7L/U9FrJfKR\ntjpmukZC2DC5EicW/l0CqZh305LhLTE5lYFMdaWQXriUs++vdIBOmNJWx8MD\ncy0HzKyHhmMGEH/sQmTchKea+Cc9BSHJYxg2BzMGfv1ZviBs2Kog09JF4F6S\nn168QsruWTYw/pje/a5S1o/l4V+VeVo938cDn1Nqz9ShVEZH9/w38d8AWMlI\nxymKGK/aQeibX78BtGV7WkNuICWx+GdC2i/NfNKyKMajTlJ4vjOQZMkIROAt\nq4FNMte+m69OpRODRndlKrAdeTzrNnlDpknVj9Lwa/fNTkk3ZlbzmwWTwxSf\nLDKUuxk8WI8WRvW2fGzsdhOc1UPctFTnYt3fesa2c2clAiHIgjg5neXt8KeZ\nDkTTlVo3TId46nk0eX+P3lRN5vlsQxPaHO0daa5R6LfD+tERkfeaxB+jF0sZ\nGcOi\r\n=rMV1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCp3OBIJuJTdMP6jgIEfiZu/r5JrrgLbaRASF6/3a3j0gIgd7jaGA6LamVEHBiJQgGzac/z4aJjiYGoh08lGeIgCds="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190603234122_1559605471675_0.14040846184333855"},"_hasShrinkwrap":false},"0.1.4-api.20190604101245":{"name":"@atomist/org-visualizer","version":"0.1.4-api.20190604101245","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"32686d9b90d84ba0bbb23ed6afad4dbec42cf603","_id":"@atomist/org-visualizer@0.1.4-api.20190604101245","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-h4exmN1H9UtYg73VhSfFoEcDVwaqLjgkr0qGEaLolUitU8QnbDeU3/Pt9tP/Zb0npNFpGxt0ZPdRd39DhwvWCg==","shasum":"4d5674520c342616c563480a835b854f2b30f045","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-api.20190604101245.tgz","fileCount":142,"unpackedSize":844571,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9kVCCRA9TVsSAnZWagAA9doQAJojR5oiyVcI0Wa0Q5P2\ncqSWPxEDTvlfOh4iHaw6oaxqlroBKkuS3Ez1+sqTn9TuTcY80wRrwHYxBSgA\nBty2Nf0qK7uadGzq/fR5jsyR1RJstkOK9WmJKlkrkc8xTBfNY1Z1e3JPr5sF\nKaMqsMJoSpSmKtB2tSqxJ+b06m3gfnY/+V+/whuthIJyGdLRgCfvNqCO5KVP\nVKV9C4nIWib1Y1ay3bU+R+frFsGCx6JnYWWRBs57WUJYrLEZEOfKZSWuL37+\n4SmFh1EhpBt9MV5cHEc1N4lffdlBU4YStc+vwNA2r5yI6CA2ZfYBr/kA18HB\nxIRyLZRILS9KkRR6FK2SsIGnKFIeV2cK7Ut7PtnBAtGOwhLDEV/bfnuT4O4U\n/PdFmwMq5Iys+oWpjg/tsGntCToLVPB1gmspZmGt6MbDKYJf5ob/Mg8NMbMn\nPwYL0B3K8W8YR6JqBYugIB/OhNJ6Iost1m6Lt+TDwYtDiYbLkH/9uqih2lwP\nXEm4JelUKvfcJ8cfzp7CHSVerDnv+uZURMl/CCWr2RCfPpDOOzYGBq9lUk7e\nvxottgX0F1foI+zQ0qnQ4smCEC5Yf6ukMRRtCV5idbpwzDlYPKrRCgJRSoxI\nQN5gZGXXrH5s1O0Tf8pIgKyZZ9/GXjbPYd9jWUTAvWkfn2fps+LEuxXiXlKA\nLpAI\r\n=HDKK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEu4cZktOrQ5qGVcpfJA+p5nnH0WM29W0Fx80KaeXY73AiAE7hxkhZQyKGM7n56+V2XxUTtKHbT2h0lj2JO3QakkVA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-api.20190604101245_1559643457950_0.20027473928289963"},"_hasShrinkwrap":false},"0.1.4-master.20190604105716":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190604105716","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"84f8f79584ead900492642050de7f37b8c9e0c9e","_id":"@atomist/org-visualizer@0.1.4-master.20190604105716","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-JIKTyGw+aTNxgRc6SF9LVoYnuZ4UxoUdilgr/jEwq69J/leb8I3IuMNwD6A4bYilnD3zzty+EZODdma+0W+SeA==","shasum":"3a135f8afc3856ebd27cb5df189457589d5d8ccb","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190604105716.tgz","fileCount":139,"unpackedSize":834298,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9k8/CRA9TVsSAnZWagAAP5IP/2JtbTGL4wYMcc/zoVDL\n2E42GkEZN31rvY+GFyFloyBS+rOi75my11TtVj8lTVFPJcD7YpC5rxy2ODtu\nv0V8ycy5KF0lDyEh0G8BwfWFYvlrsIcAxCPfLVSbU0+sWdMEQyITGOOGK9Vw\nYVKkHX3edvba4gvx+SNyuUTPGaIyr+BFWZ4zhdNQ96Xu29Hk84iBsQP7T3lG\nNYqgFZe/3MARkMpIRrqoH1BexBFSPF9G+KqL4aKMjm/gX5vEI0yKmBHx3ZBC\nr0G5i3bVvsxClMEs8VRmZryJesuFRGNjr0nZrFbeEI95Vp0NA7Rf1ptsko9s\nOz8DNUHOYQO+xMgqRFEDxkgjBpSAoptzL0OJtP9Z1+rHV+acsIenkUAd1EiZ\n9nFGMqXrUkKDpLl2Hu/1zfLgi8ZBqZbcGcwJsNe5sGQfPHt8UghdfcJX+9T2\nyWUl/5ozDdgcRr8/F0cJW4gqfcL0zwRCdjSOMR8C04HmOXwTwiRQ5j8y9fbv\ngDu0B3gZcT5HABn4lTpdDdqP5b6wL4eSEvVgX/twrRB0sd9/sCrX4hfElYdZ\nHL89auqkRSlsW0atl7M0gGDaTXY5vl9WLn+Udmlw79SLeY2pJ04HX4Qln/44\nrLh7UnnLcYX5A4zbPaglVg1exd1JRQVqUj+wKShPmHixIHUbCIQErib/6ghL\ntEeL\r\n=6/Iq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDl5tt66xNLTsKkO3hsMaBmgRy2ZqZb+VDwsopUdbyTywIhAJFBNrpgAC0YrGBBbV1lC73LLie2+rX9jsWTVZ6RCdi3"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190604105716_1559646014502_0.39226091188965295"},"_hasShrinkwrap":false},"0.1.4-master.20190605031048":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190605031048","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"58a6c0d33156b84b7160eaf74c1166746da0a74c","_id":"@atomist/org-visualizer@0.1.4-master.20190605031048","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-G3AWmhBF0a4rICtFQrk8ix6TbJADyxWnFHSeztT10hveYPZx741tzwn2+peYOxrEYUILEBSbA+WOQY5si0K5Vg==","shasum":"1946b049f74694cc6e3f2bb8b03cf72a514d3111","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190605031048.tgz","fileCount":139,"unpackedSize":835543,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9zNUCRA9TVsSAnZWagAAkewQAKKwcC+/7Uq+ZmRSvjoZ\nd77JaCkhAbcG8b4VLD5o3fcoe7g9lQqToETrsY1cO+QcQH6MJMIUYYNcVSCl\nwAiPKp7914/jIMUFJAYXHLp09sv6nAVOnOijjEEqlbsOUcOwzFj38AeJqPEF\nLu+XX9sOmDhynnnjhGpJJCovkzncZ9O6XbG5V9XABmhsZ5E40NlwSeFNJhg/\nvD6IgPO7DzhyDUxW+zreFL/ZatCxJwf0IDcfG6sie/I01s+/QkGETcAdOZYw\nDmdX5QxY/4hmIDO2d9vxGUUINLtkgINXv595lgWdSuvWJ46Kmy0+RNgSInls\nvZQj4nLohbaeqPBd/1aSTQlToX/s+CvkddWWHQgf+R7uucG2Tvnaj8HSW0aM\nFYwjpnTTa+Ht+N6j5oUAdOc5EAo+Wa/5YO3G/8xkymOJY2+NSZ2JyykrPHex\n5Ol2LjT+54LDkrTCS2qnKKry/YATG1Y7l3bBNWiyW4PluNAOlh7/DVRIff8G\n3FMbXGsfj46hL9zjJ9HCjJF0l6byt5HyVxbGDvfFiw+P7pmhQjnDlmhos6pL\n/8wxqCQw72JejB16LENFzBiBLbm7vJfCo6Xb+ZDip5XsFd/O+/1J25A8b91x\nwQ1qoFkWrgVq75vYse6aKxytWX7bVCmdNYahDgbGT0eP3NMZL4U7EKvx5Ilx\nCpnc\r\n=DlAq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCFQI56T5jyOuFVuXvymYaPx1Aak/YNNBcwIiVuxnalBgIhAOPePzWEIijl5MyYa1643Q153ge3ZmySu2cfJXIvtCme"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190605031048_1559704403762_0.08731615012839011"},"_hasShrinkwrap":false},"0.1.4-sql.20190605072229":{"name":"@atomist/org-visualizer","version":"0.1.4-sql.20190605072229","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"90235965134fcc5d1154fb9e3d10723eed2546ca","_id":"@atomist/org-visualizer@0.1.4-sql.20190605072229","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-dJeMCsr97LLE8IL5z+vb2uAN/zcycMT7JRhmUS06O5utFt2XBqULblJbKug8p4M+jly2/DhYkD3gwUoYwsM3DQ==","shasum":"c32cd955021e4f11e82e4b0d15ec3c55f008f5be","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-sql.20190605072229.tgz","fileCount":142,"unpackedSize":841286,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc925VCRA9TVsSAnZWagAAAXoP/jkqjEZ10vH3o+oURAXU\noe7YPo8kxodzkmTG1zhBgbjW5Q0AOS2JfvSTObu+kXNBHdOkzTzOdekAg34a\ncdBbm40V4cnP4VomAUUHDvJcPibPdWC/qGswe6aLVfntfCze37wW3h78GS6v\n0R1kOldzbGgYvloXBBIkOkkvca+ZvTUyIXN6vVYzQIKqo69SID2p/iQP52g+\nuZtju/SCPVax2zVLW44UInrouyJp8/cs2Fi0XKYh8YwZks9BIqp62uawEtGa\nd7x44RjxN3lf9++HscPE88gpfnwNqnDQLR1IxnWhSyXpzf1MzFc7/c56fznY\n9DNWJR3MRPFc1BlY5D4D6y5b5dwtvaQ+ww1zpP77nywyQMUXECXVvNfQJIU9\nGiQUiniIdSPaYgfSYAAJPspqis4a0UUui0HaYGh1cVHUvbvCk3sgzG8Eo59R\nmjWP7YqOJ0XUvM2pHhp7JzipC/RB/VhSyTe9S3oLTan+wUNHum1ZqFVVxZ0i\nrxwWF72MO8rvu65/y5g3+gLxBhhcUntscmWlU4VP53jCP+POtVDoLAbLiGig\nUExccjLAI/FhUY/McJLf2Tj5Q3gKTulSkkAqA47GzINDnFPt/wQGxXGCQ6/U\ng+kam0t1MN6QY2oLbFIf7Nb9hgdChR5byJ4lnzgsZKw6ry09GYgtoMOxPSGe\nrqgd\r\n=WNnR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCt9Z6jVsI/uFAYeI9ioqHzmDHUFsPU9ggZFp+PaeVTEgIgE6MEGKI1y40Te33bFC6RkAKM4b7f9suXB1bFBaL4Aw4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-sql.20190605072229_1559719508579_0.9302205702273967"},"_hasShrinkwrap":false},"0.1.4-sql.20190605123040":{"name":"@atomist/org-visualizer","version":"0.1.4-sql.20190605123040","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b4e43018ea6f39c712c794dc0504b890591591a9","_id":"@atomist/org-visualizer@0.1.4-sql.20190605123040","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-yVPA2oqgld8rapuyW5PVtpK1epb6tcBZox8E2b+rNlvan/LvdQiuhRS0SkLhsOKKXuAWq/av3h/j/V2SCF5Brw==","shasum":"2043cd1f4a4fc7c2beb3f1eba591d8aedf936552","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-sql.20190605123040.tgz","fileCount":148,"unpackedSize":851789,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc97ZqCRA9TVsSAnZWagAAxWgP/2s7yjpSvWpPC9uDn9oU\nNW5/ZOIGL3XLMPiwUAMJY1zhlL+h1pMXy9+UAx/LbIXNEx1/kV7rlWPeBsHj\nCD9Lru9i44Xhxm9f7ncAIiJ+jbA/MX90m6eN6ngCn3Cm+d6iwWnlnn20+tB+\nsOYiL5MHFVrX4Naoq/iPQNH+oQ2sJewUp9ddPpR3kH68nDhedtqkv52nYnaJ\n9bGnBzgv5xzVt/ZDWcTK92fLiVX0htdC0s4bSVs4mExnF+ouuuMXAKEOcypN\neQCpqXLGLDGtWJdjmvaQYbm07VgMp6pRzVeUQO4vi4B5OMYjxANjtfE2HomG\nlTb9jSDuKg1kfQWgJemNTAFtmb/QNQw8dsqHKXNdNTFaguDMc2yiDkeMql8U\nzYUK20tK76ZXCjhDUDimvMRvKCu7/KjZRTYhmot6JmMgDJ3ZFCqd4ox062Se\n9Pn22W1l6Qp2Vz7z9UE7z+e9V+fRO8lYPxheyiDHUkhpCQ1jTJgMsmtm+Qtw\nVR7AoIUIJFxbZ2I886oHx9C0r6F3SFWa2cTgpvxSoBvAO8Fya3OZzx67h/Lc\naIui5ZC0jCsQ0yajI++dOkz/4qDsg/vJ+eb2FJRpZ2xRyRQ0RlEwGWasuCYL\nKd0++87Udhb2c0KOK4shHv3k5wtPUpwMLk9JwK3rRhbUmljB6UUqLc0RvuTg\n57RO\r\n=5xFX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC81z55yeQ/9la0jbRIhQL+Hr5T3d4+3Ay9F1fFJJtZMAiEA3egvoGy/WGJKk8I/FzQOII1qd7ymlwhnoBOFgCqx6VI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-sql.20190605123040_1559737961938_0.7400586440479122"},"_hasShrinkwrap":false},"0.1.4-sql.20190606005028":{"name":"@atomist/org-visualizer","version":"0.1.4-sql.20190606005028","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f93d09ae6a55da6ca69720161bf217e47096b226","_id":"@atomist/org-visualizer@0.1.4-sql.20190606005028","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-5NSo2p2/jQppdJE7ceA027aU1Ggk3n4Stuknk7b/G/iGnjWucCGRuP81EEGGwmXwV0xeo4Sq5T4tH3pdudJCsg==","shasum":"cc628d31bdda3f29e8596f214f508c49a9f010d3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-sql.20190606005028.tgz","fileCount":148,"unpackedSize":853875,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc+GPXCRA9TVsSAnZWagAAeRUP/3FgyNFwcW0iuq1nagm6\nfHiAVAeH8titcpEtGsw6iKPX1kDtZ5JoSsP0hl2aMRmSDbggkTeCLilkfron\nS1q/seNAWj9fJfhcLM/SJzW/gKEgR9QAxHtteYBm1xOP1oUfggMg8moVokw3\nK0b/O9zVbjj9eeVvbjOA8R80+A1yhyj4kxY1qJtrwQl0PdR1LYMUjj11o/Lk\n1a5mZ1Yq/U1112wDKIORODEUzJuvAawePTuCOnfEFfJsNPebhSHX8/YYr8LK\nTlW331TRC8z7fWlGE10W/zrlKvKLMH53KJlURKKqIyAmGVeEORRmn2H4OXSh\nqxAImKP9xGvq2zixctfLlODgasUQi9ScPpM/cc8RGDg7UNqZn5RTDc/RCtNc\nlMyNLEpHrejtSoNvuzKyY8EF151rfYZg1VWQx5ZEydLDBWKj0L8hcaNEc0My\nqWtD49vwdUC+skucdUd0RKRQIOpAU6mw8Ko3hB92EdZvxxTUHmFvgXMaUj5K\nmNQh+O3f+J7mFAjqXU6FGiDXawVWb/tqmOUgqX0c7ecPUzQri+F4M++oq/JX\nOJTvo5dfFqXiSSFZgMDVDA5H33uGKS61F2VeNO1hTihAq5BYYBnrof+HPEZk\ne8PSwI+G4U2WeAauGy3Y5Pj2fhw4MjTxUxHsewZ0F7foWjhdkQdNqH/gumhv\npagx\r\n=iB7M\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDMiHlOk+ho9a3iBvJUP8VW9un8AcnL0ShrvePWDOvVogIhANon74Vvlz+/q62YuSz9VT1GvSeU85Guq9z5PbG4bW21"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-sql.20190606005028_1559782358751_0.6977266937292466"},"_hasShrinkwrap":false},"0.1.4-sql.20190606080832":{"name":"@atomist/org-visualizer","version":"0.1.4-sql.20190606080832","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8ae85d0fb75080b5400d58d6512c34d79f4dce4d","_id":"@atomist/org-visualizer@0.1.4-sql.20190606080832","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-bu5EcRQ0DoutQJZwsEfz8mzZ4/s7pqBajVMJIehXNGqZOTC2d3MZH8yXZVCbo04TH3ISNdbmCmuYdd8u/eV0FA==","shasum":"4dabf21d6f63f6dd737672b82392776b03c38a5f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-sql.20190606080832.tgz","fileCount":148,"unpackedSize":857090,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc+MpuCRA9TVsSAnZWagAAWW4P/0oDsp4jTq/+1mz3WFug\nBuVB1XHlDn/zUnDQF3LzWZ+Pg+8HmH2GJlrs3QTR8hY/z9bdC/WLeZxjEYsO\n/bLrqi0UpEh0is+nYw/TFDSsaNzZFf/89dG9a4XUbDwy+fjODKdndanVCnU3\nNWmkiqX6Gi2LtROKRWSr531xOk5i/XqIgg3Fg6yCR6k03TGJQU0bTbYfFGye\n1ljYaEgm2qY8geyNJ5SnjAOpWQc6DdcZxmKENbFRqPfFrz9Sk3mjhiVTczbj\n5z9irmpao0TSDNE7Zv1BgtluUtzQzB2qv7GY6Gsnqo6xEHMAv6aK6zakk0R+\niWeQj9J57nvs4goM0yAEspuYENGTzHhNhGQz4NyeGiP5luk3qPSi2jHQTev/\n/+VAP7lZVivMA7ZvOmDYNRHJFz0FLoDWPiv7wdgUu+c0SYL3RrIKVi879yjY\nl2ip/LfB7bL/U64OWgRf4DjEh0Tq3b4rFEkNgiwwqLImc/8grok7W7k+1Pyy\nybAFx0g/5EieRjXhgfX9GazRYm9j5NyvVtfT+thkWneBi1dMudTfJ4dgTlzc\nj+c9bURe7DrT/TH4AU23S4Lu5Hrg1qibfklRFLm3MmCvyn1722P8VjFQLDM7\nDv3Y3apcilNOF7Qn6hVLJ7wfzJWUjcktex8ihtKhN6NlkihM93/YtiLXlHXf\nrnl1\r\n=qroW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDfbhtex/HwM96gqLKv+pFr7OGEFObzRww0rXuSoIESVAiAHPrWQpMRMhhkOSYFpqIdNqWW7tIa4Km9Pi9V4cub4Uw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-sql.20190606080832_1559808622249_0.03189003303898019"},"_hasShrinkwrap":false},"0.1.4-sql.20190607073409":{"name":"@atomist/org-visualizer","version":"0.1.4-sql.20190607073409","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c71dea197e98192dd969c9f099547dda948f61da","_id":"@atomist/org-visualizer@0.1.4-sql.20190607073409","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-MozzVH22rumZZtR0yy9gCKmLmtvJpUXfizorXAXdxp+LinkfiCggzQBZb97wQCWEMa5nBYcrqc+b8mbxKWPJcw==","shasum":"2a804b67b4af9efe4a7757192ed2beaed865d397","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-sql.20190607073409.tgz","fileCount":148,"unpackedSize":859549,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc+hRqCRA9TVsSAnZWagAAhJAP/1e6KPpmKhFCXNrEPoaB\nWLtDltfPO5m337/VvsPBM6G/gaAPLizgewHH/nK/LCP/E4/bP+l5kpSVFJBu\ne/5vFM1JKKclxn5Gh04TuEt6qjI4jOQ8A8e8visappt6RjnngC/XcgcQYC7R\njQ0RUdMVAQEPLBfnN3jENv/LngWxHIsiC4eDA4EXLYDtxpe6fK0HZTmeczDW\nL/FNoh0qdo76EZD1Fj2ViuiTNX7p85GCVbQvi/ZCstecrVYf2E+YJbV83WyD\nOPNWRxHL8LAqiklOYE70vHvJ8PeNNoKBwAt7O3HlwtY5My0OhOvabVPJmvt3\nyDe3hCGOm3sCjqgoFADp6RT9miwnneKUaWmk7Vel3soMyOsdHU//7iPcr5RU\nTaBTFG9O86pgcdW4hI6wo5C2UBier24uANuipYuunZYWlSYbCu2BZ17MDWsY\nLbxtcr1W16cMFWtNt3c8HPsyg1HtJiUBmoytxo5YiTG9EKmHNfb3fnhBhrCy\nSq8n95e/SEBIS4nYEI9r3LSgIORfLRNL6MO/UI2nxQQOfYO2ss4bKLCrSRf1\nM96rYC+Uh3DAl4TxBKctJkwDzHFlYUapN7J2qS9cZygruA+zEqpInbpWWCQr\nr4nt2q8ru+QjWPzNvefRNbhGWT+ae4H5UbZwuWHe7RlStZlRl5dXulGJ62Jm\nbl0f\r\n=iNEN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCpkvB6Tw2lqmPhY2s7Ruilgz5OFwtIgfjMr/phFZ8yeAIgFFDVr+9xuYJjxIAkdIGWyn0bUVgSvUsh1Ehhn1Px0Jg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-sql.20190607073409_1559893098124_0.00902500910587345"},"_hasShrinkwrap":false},"0.1.4-sql2.20190608035910":{"name":"@atomist/org-visualizer","version":"0.1.4-sql2.20190608035910","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c244911e94f9cc66857086242c518335c67b9076","_id":"@atomist/org-visualizer@0.1.4-sql2.20190608035910","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-TGExKzXJ6Rkj+5/A+lHINZpMz2+0l+MHJrwYy+EV7OkajqfNL4KKYpf6d/iU6hkejVEMYKTyA0jSxVQvaNu0Xg==","shasum":"fad21a6ee5c392734c66329e202b6738c78e6567","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-sql2.20190608035910.tgz","fileCount":147,"unpackedSize":860250,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc+zMHCRA9TVsSAnZWagAA0cUP/35Q7uTxGVdWmEX1h1ji\nKgMToQ3yv+J6ywq+ckLYxswGDHYwNRD6RqoK7z42fVSLauZNXc6pgjIhOgSt\ny3/lUpDaHoj00N1GYKiQM5D9VHK5h7neeEtXbl1ERv/9X5D9yjqP2k4QmkZD\nApMh6FTPhm24Qa9V1s0tkG/U07/g5iTODMkNFRUupRo6Y+ZWxWBV8Jz3o8Di\n7Iw7jfShDDKf3t4Sebt+GR4Kw2sadR0Mx7iK/CCIKeTyfwqZroHIng51qa5W\n8lZ1e8QMv1gSaYR53wWRfieQY3rvjqY2MkmpyczfaJUSXXPq5No/qS7XzMxL\n5dBAQq6qi/45NHF63tnKnUqxCUGPktT1CgySuu+1NwagLAtsNGcGy3I+PeJ/\nkaHibN8JIfEPZ0KZz3SIHlvqfzoYw5j0CMzuz/kiOKTDVT7QSQYs24BBgs0D\nJGQxe3HwwY2LwsPpTdJ+q4d4XBFZhJl8sq7QzHUmns27NeyGhV3uy7UPMLOs\nYAS9H6HB6z+JKzT7ZEC1O6xm9ILq6IsXuY3p3/CRBf6OCaNe0SPeOYkMDsNw\n3iQIJ6fi3ld/uYzcrjRfN7XnI3H2a2gGV8fE+vGD2iDZF3P4RTHdEorouqmM\nlFaav8zbTqjdCdm99gM5RmZBDHnPcc/eUyUV9kcdxiHjmsWsHlkcAvyHZn9z\n87R8\r\n=soyL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIERJ4aFNCoe2zjyMnYbk26loq0x82GurIxvvOc+LdOoWAiB8cxZgnVDRsnMVVKwTwSKxRgWEl2NKqY0/52HdBl6Hvw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-sql2.20190608035910_1559966470184_0.5087167192424691"},"_hasShrinkwrap":false},"0.1.4-master.20190608091239":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190608091239","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-master.20190526073852","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.4-master.20190523230150","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5b2f4f16cbafebba02d08bfb872e3e55b5fd97ba","_id":"@atomist/org-visualizer@0.1.4-master.20190608091239","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-O8U6pTp2tM4YWK+HWBLWS2K1kn9ZJtIPNs0t80YdKUPU1lhl77F4TZ9M1wFJPlPTDLdR7gRbLeJo/1cMRXm29Q==","shasum":"d1db3a337a7adb7f92b8e16a5790e8d3ff582f18","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190608091239.tgz","fileCount":150,"unpackedSize":867166,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc+3x+CRA9TVsSAnZWagAAdEIP/3GgvrQ13jqflwuaqjmy\nkchyY70ytN9jToLzIUctHX2dWeC/xKnSIAEfYKla0mf9KgvZxZZu/KWfKC12\nnlToR/xhVp1RK9dMGGO0huUvegK7gpzuoR6Sdoi0sUx2OkwKMHsu/8jLXD7X\nBIhmsIiqxXVckyW0lm7RCfm5I6u8UUeYRHZobfSF5XEVivJDISia0s0gdVAz\ns0wyF5XZ5SaJk/oaHiGLw78WQgPfpkiZfAwWz/MPPZGX/VLlB4bdqRRcOMoo\nGIjvrGBacnxyQOu7WZr1tVLFlNr/rpahgyiCjNOxiRS+CJiGYnYiP0vyKROm\ncRhvIVhUE+ikTochrEMaOEzJNRCCo349Ztqv+dFMJ0ngyVJrz1dERrPZ8HTR\n2ly7UbRkN1FLzh6HYmRp5bTEnEb3rX/6ycpPOx1wWfwb9cg3wveqmRAT+BFE\nWPcCgPW0/lL0+wCj92YX7GdtZsBpu6lv2jzVfFQLr0b8TKDxMxRBzwqhm66b\no0PBPK+KxymPNMcexc4wm91kvPVj1XOiqmcpuZgIQvqdBcHhy9v+he9OBQ1K\nmzprmWpYIPtCUF1T9s2lTw0xHFV4+cOQeoBSJT0v6VcBZ0A1Q0F+VuUC8B30\nPnfQ67ubevZ2gD0WoXSwojNe1L0eeHUgdqWIwTxNpgxD574z7a5Y29mxo3E5\ny8bA\r\n=DzAT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCypjuohKecgVPwy8P/rMaC0MbcF9GuyYK8iS+7jIEvNQIhAM5qQFJ32r2n/ZtP3nmgN8ZeOIwaUYuqhlwmEDBB9SRP"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190608091239_1559985276977_0.3300146942215578"},"_hasShrinkwrap":false},"0.1.4-master.20190611003832":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190611003832","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-fpupgrade.20190610231526","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.8-master.20190610034702","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b00f4cecd6ffae2c3b153394aae305cadb60e97e","_id":"@atomist/org-visualizer@0.1.4-master.20190611003832","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-qzD3P5yCfhMQStJkmdKyS9fiwmtKplHvI32LYvRCbjqA3PZX79VbEfFHJ4MYSvqf56ms8tWZ0AfLSSFS4UDuvA==","shasum":"a0ca7f388e54509bfdab80e3adf0620e9cc7892d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190611003832.tgz","fileCount":150,"unpackedSize":866887,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc/vjWCRA9TVsSAnZWagAA16IP/0bKLQm12U0CQP3q1WrG\nVuIYhMIFXBv6rKqlCSNtiTy+pgdHF7jo+PkuhAXq+MFQ1bS01p2U/Ip+PsK7\nulgj7dL/K+1WDotVQ1uyRWUwQ9Bn5Ur8ZEAFdoo66sKCWkg6MXD2LBGHby8d\nWjM6a42gUnL2oZdcXnWTF9ogk0zYShiHh/9B9YomPDL34zTTLu7epFtdccWE\n/S4xfJb6jGE3ErdvOcG/Oyvi2E4vnOlBi/Q9T+IPkbOI/X/gKViz0wcozHKx\n06yInVaYWLN/cu+o0+UeoCWefCZ6WTvKXh3bFmkVxlab1nFakC/XdZklmXQu\nkEtTGOwKoO+upgRt4k17QEj71BaGDk/eAFio+y2BTkTSrsa/IZTxpLdb4lfm\nqJS2NrdErj/RJqvGVMxUc/Fm8qj6aqz/L6UI7YXJRyl+xjYcXkMPpxPUjh3J\nO7ZgnQl6iZPc1Gj8C2Rvnc+VVkSb1yvW4+TvHZlSD+6MVwtfYXvrcVcuKSsw\n8YhT1RavUSkyKLZWfA1PsMDHS6yWnl5kBA9PfddDsI9TSsYBe++X6VBVb2XY\nbRA5c8yYU6ujyrPaNgO8ZeCDW7G1ZUON7lwJz3KqJBHsqJLX0NTp/a1MkZ9s\ndfxVI08+FzAoiOiJQ2jcvQz9pGx9qbGHryJCKnl/jc6w11rzR60Etkx5vxkc\n5jUB\r\n=NqeE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDv6WziTn4rQk6DFd4k6nwFM84YCB9LsRc7u/d0X2RLYAiEAwJSMrdvG/TO16OvAsPKLSrjnY7ZlZ+lIBr9blbDVwbk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190611003832_1560213717954_0.4303221189419135"},"_hasShrinkwrap":false},"0.1.4-master.20190611075648":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190611075648","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-fpupgrade.20190610231526","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.8-master.20190610034702","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"300005d3a0477c68000533a3f938c1af040d4dbb","_id":"@atomist/org-visualizer@0.1.4-master.20190611075648","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-LL7yFIvwsXyMqOWsfwBZL+2+HlCDCU5j2SqwzmA7RzbzizgonFfYLVm6nkB68ATv03t1iyb96Ghky/oStLkPSQ==","shasum":"ed8276d65da9d9a8bf55e34550e6c59d43866bc7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190611075648.tgz","fileCount":150,"unpackedSize":865458,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc/18pCRA9TVsSAnZWagAAY0gP/ApxhDX/QdWnlxz+gBYA\nHR/Sb33EZw4LHB4YlqrvmmuTtGreijRE2GYGI8/TZHmotwb+Q1erjWTWvbfk\nzgc327ZihOFcOUfNLQfI/m+nThPV7JvGg/y4NhNJbtUIxLJLRKN+7UQSLOQp\nEKSvY4aP+eAJUxpC93gw8FFOA1i4T2AKQMqkCsTs7K4CLis+W+Vq+Uo09gIt\nMLm8H2YOCXJcjoAB5oMkpSmKgAsaNoV8isc3P/l2vMSIkhHV6l8kgssiLK+4\n+cC/kPeK91tb05P0RP6ZpR3M+mBJyR/g3Qne35fvNyDlohZ+N5mHPJtgDYNM\nIqtamDvjF03RIAV93Dip0GPe4/kJoMxoXmE/P401wB9SYfNCogXBu3gFyRpE\nYrCgLBG9+1mF6qjUzi+3Z9zY2zJ3+nCS59s59iDYp/yyYJzwRrOKZ/sgdVOC\nZ9zEg4IiJYjatPAt/Tv9XZp+A5RXORf6ROXVGI3WPBtFle0LN2qxKIit+gNW\n7xgqKT111aX+wT6QVorKCWwmQZPzKikJ5wUjhrtoGwAbq8Xy7qvJ1Hdtw4g3\nhyELP3cQH1cHDCvzuXPGgjia5p2T7vc16tybif9K0v4eL4i8/hrdnMNgDD89\nDJaWfoEHL0mDfy2WBuY7Q2sD1pP4DqgRMyo0sp+kBEoR8TlBDQO/sE4dVnIX\ntfsq\r\n=be0X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG3dEAiPFlcf2rwJDOkoKT1sEy0XjpDMzulvvP8oYNXRAiEAg6PiG+4GbE8jsmDWvFWAR27Xs+LG4t4W/UVRaPJA8O0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190611075648_1560239912498_0.7569857538990454"},"_hasShrinkwrap":false},"0.1.4-master.20190611082439":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190611082439","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-fpupgrade.20190610231526","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.10-master.20190611081131","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ca727db99b1a30783903f38081f30fea99953c34","_id":"@atomist/org-visualizer@0.1.4-master.20190611082439","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-0Rpql6KnKeCQiuixjIXsehBdkBMiwJ+O0Ll7xXyCxu4gMCozKUdZ7oGglQUlCRhMJSvCrTKrwykG7794RHCimQ==","shasum":"985d966b756b12d4a2e538d7a487e2f67ae1ea3d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190611082439.tgz","fileCount":150,"unpackedSize":866191,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc/2W9CRA9TVsSAnZWagAAHOUP/0qA7Zu54OQCEJmCuj3z\nZPCLqBtO+zgGr8aLrSYJg7jRIJuFRxZ3UDPXkELdcj6iJkjrW1XxDQX/qXzJ\nIJFjH0CzNFPuHrnV1bY11122t0tCLd40ABzrqp0xGrfulvYQtB+K/o1Rfz1a\n3lIQNVzz6fT0h4TJGOX1O5g+fv/L7Wiml02Ne8QobhueVzlO1JEMFyrNGbsR\nRwJKbbyMdaxmueCVWRcXvOD2IKJtGggGNKW4dk+l7cuHfS33W4siE4x7ccxG\new2YQceu7Zt/96loZZQU44NfzSVcZGj8RV5rmzaCDATVs/1FRNTrk0/czk9F\nu6O3YuhDeS3XVyRo0I37O32/kroUSTunWtDj7W5lKRsV1FQts/rt+kdy6Ozq\nUPZui8ESO7tyxytxZiDORg9BZcuwc2SA3UZxM6KuTADNY1NQOjkxDjABvUuw\n6ugVvd9NZB7hGG/SwAyM0vwQHwuau2or9QGpSubxf/gy1eyXnHajJem9UyXQ\nau8/ViPCpdAfrYBd6xiHcnM2mfO33yorXimNwpGbmofK62E6LSg04PKzL0US\nfH76R7laxlHOFUOZ1kKjeo8G7bF6jn3+f5cikUNIL4emeYI+ZgGbwH0R5qML\neB5hAKE5mj+L0VVpUidisgfqHRmyTyLIVSK7qO/bGIvIitnm/wGzl8bYuYI6\n53gM\r\n=VI+f\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICSd0B6qaLSZgm7Z3qPTicrYX2bJdvSb1ZuJJCEqVEYiAiADIyEGKctOiPqH5eLNSANyta2yVmOh32qV85k+w9PuFg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190611082439_1560241596397_0.9024602427783046"},"_hasShrinkwrap":false},"0.1.4-master.20190612044708":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190612044708","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-fpupgrade.20190610231526","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.10-master.20190611081131","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"23a2aa425668fd383e525cf1a2d4008b2d893fa1","_id":"@atomist/org-visualizer@0.1.4-master.20190612044708","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-QkSy/+JSzHUeDfPahEKsZRdIFRlzrLG8jeI1GVtDrK19ZSNKsN2n8LQMTfLYFs/CR9rVS6vtEhjNc2PgoR2KDA==","shasum":"53bc746555ca753507e87ef070e9432d8c74e6e4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190612044708.tgz","fileCount":150,"unpackedSize":866569,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAISQCRA9TVsSAnZWagAA1NIP/1kBuPwPDy2s7qMh+lD0\nKlNOf1jQ3qjq75XziUILT/plGbt6/yJ+gMCoMGYySRNJR2lcBwQA+1teK1dD\nVlDnD7FKa0RMpk2KhCGtkuTCh7+I4u/KnKURIFAZxdbYvOMz889g/2R/lSGc\n8pOsV+kYAZsOevItLX3HVHSW1WeMlhrjQfxlyOisyw7NUeSGLlcomP8sxlj1\nb6XvwsanidQEp9i5r+wd0mpwa979sYZcSrxVsFPWtRC1+iht+z0CbEh6IG0U\nnMyRbrmB3RTIEHqlfpIUB6450DEeQaxs1grMkS9hO7stf6ai7CH7Lj1/jACS\nkHNFOL/gKrW3v7by23C2sFfmgW7ek57x8/T8RMlyQRKi4MaNMllDIX0IexUc\nJCLLucXFTuyDRlmDkKBczdwwngXEWnNoIG2YE17URppLy49RDIGmkicxgzc/\nTXFBTriXb0rwNc1whDSDWGz81ZzuawqDzVX+mvVxtsI/1A7bG7IqWqXzsiay\n17kK+ENQSNLSbKclSzOuO49bnZEype3fdeVqMaFsQrV1KBTdy6tK3FGUAW4p\nlwtmqX0W8Xq4rpsjnK6Ln1j4iRHZNBGzt8NwWqDTTeIkYMlAm26vmj73F+fB\nn7AT3QIB5Q6zdIOWDjj7oRjrJ8vOIAGEnbCE2RsAtPN5bv1H7u0jEw2qe7Nn\nP1ie\r\n=aWiK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAHZEz/3eX0vSDak5HQIB8xBR2//vr2g3yEbDlBe1wOtAiEAvYjow6qFNLipXYvhZIGhQ7crsE+LHe29F+n1lwzcCkY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190612044708_1560315023287_0.9191451790305403"},"_hasShrinkwrap":false},"0.1.4-master.20190612060332":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190612060332","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.4.1-nortissej.in-mem-subproject.20190513221636","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"^1.5.0-master.20190517174921","@atomist/sdm-core":"^1.5.0-master.20190422144825","@atomist/sdm-pack-analysis":"^1.1.0-fpupgrade.20190610231526","@atomist/sdm-pack-analysis-node":"^2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"^2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^1.2.1-master.20190502172115","@atomist/sdm-pack-fingerprints":"^3.0.10-master.20190611081131","@atomist/sdm-pack-node":"^1.0.4-master.20190321220053","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0-master.20190421053515","@atomist/uhura":"^1.0.0-docker-parse.20190504213223","@octokit/rest":"^16.10.0","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"^1.0.7-master.20190429204230","@types/mocha":"^5.2.5","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.0","mocha":"^5.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.0","rimraf":"^2.6.2","supervisor":"^0.12.0","ts-node":"^7.0.0","tslint":"^5.11.0","typedoc":"^0.13.0","typescript":"^3.1.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f532eb9bccb62878537ca4789618b6a40470709c","_id":"@atomist/org-visualizer@0.1.4-master.20190612060332","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-BcYiobMJTu1h3elJI1JNcHWMOjoJq6kmN/vRgANXIjZ9mwY6Hb0+FtQfzD5+RIagEDwPBXuyF6uDOqSuu5ngSg==","shasum":"8988aa4f5e72b73b572339644539c1a581c932d8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190612060332.tgz","fileCount":150,"unpackedSize":866628,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAJZOCRA9TVsSAnZWagAAjSgP/jtvkW0BuvGlW3gBQBU0\niY4vh5RhEZZnIgLONV21nIvbNkwtDePnzMv2CeC2wnU0DvPFGcmRjTEzfKQY\nPgfFlLQCYtKxL+KnuA56rfnDmOnTgNTvR1hRcutt0yrOIy8EEnBNr+Cg6Q4Y\n6sau1GXyADdNhaL6Aj4KiQWPWt9j55TpG5qSvFHwYMrbYHWRytunRxspVfAG\nrwPX6d5bIlUJNGqdiOsgS8J9e423NPm04P030/hxEvN4g5Wu9/nDjZ8fzcgw\no1x1vDKwVFi7se5+2aFbvCXeXrgcevptnFJu+YANvUI7E82Adqa1mjc6iVZ8\nbYsgS4Gfg5O/v7XqYUWyPT/4tLBCjB1c4eb9CXhtr1LAP/90TYeorxGlhrZ9\nAach1ZyaPqtijBJyhnheyQnrsYGFKsLszzi5LiHCQzyappFilroo6uT0OnM4\n49mQQZRHrFfAAQzXszC+evbGyU1Rc06dB3BMd67QDhWOBprE6jazXlDeIlEV\nSqmLGYBUzCn9JN66FU3gMHJx4r+NCYhfPUNvqbHuv2sXXHloEbF7r9XuZTvk\nqtKbxrCk2O94smaq2QO2fuU+HT3E3u92Yx5I2xRBvqf7uTlRnazBBfsfUGMD\nypyoMie4lP2GZUqklXpFDL/aomSZnpQxpplJCWTeYIhmrSwdQwIzHfm3Uu0t\nAA6l\r\n=+7t7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIELxbLX1Qn/gLjhKu62Eiw4FV0VNL24eBxHed3VpLWf5AiBflDKlObyFSWq2zmKeFd5WAaRvOQKe+Wtx5JKNkWauEA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190612060332_1560319566165_0.3987297321017196"},"_hasShrinkwrap":false},"0.1.4-master.20190612082450":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190612082450","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190611205206","@atomist/sdm-core":"1.5.3-master.20190611210859","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.0-master.20190612075058","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"93057ac316f155954156b8dc734833360a5cfe7b","_id":"@atomist/org-visualizer@0.1.4-master.20190612082450","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-xfaYxTkledeLbadeU+vFNj/iV5lKfuUCAhhIZ9FBfF7jKZTClXKzsr/6s6Q+sjL+FlRRpJPfVaCU2wmx4fmB7Q==","shasum":"b1c0133cd5dfa794bb57b611fc1dc8173f981bb0","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190612082450.tgz","fileCount":153,"unpackedSize":867102,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdALfLCRA9TVsSAnZWagAAhl4QAJ4qXyfhVQJS3NuCu0+e\nyquVSQs01jJn0sxe5JD1oPJlBSHJ5NLLPTS6BntCJxQU7UJoGYugr+LKfq2R\nGpQsiaz5pD60cZwRF0w1+NxGoV9XpzMsGq/zKpwEsK0vx5M1ESGmLRUagDur\n0egbJFOHb/GtmzFSk76GuOGfqgoqmXk6ea4Nhgis1lJkLCAP11qKb986HeYp\nPMdWCKooavXdwKcI3R0lr0SopHal98mvkgE8kel3ET+qBgvCdn9C2D2EqXv/\nH9XiljEi4hhSgafdX2DWvb+xwR6/PhI7Gsq1YVZmRUSDhbRgG3c9fFT9/Zm4\nMtIADVp6hZ6AULzFOlg2Ih/qTmlDgYVO7zLy2okgSOxTlFs8wtdy/1CpJvwO\n5fwPlPf45NTHiw67ADiJmdghh2YQ7Gqgn1fkk16sUQ/I+j2/AgoeBPagLQIV\niYdz5ERf9BCEnqUWQabKFiVjNZDO+tl9imSmBS731Q65UNbcErlPgBxOLy/i\nEJcWrQOFIK18SniO2Bjh/Knme86Fxxcy9hSX5/v7hXQxzU0x4PoWhSC7q4+8\nmlqq83cJJd1z5KJkt4c2zWoyNOOkD2GAuPujd4JmRHrcoPmj24CUHzvqPZip\nZcB0zgTdEFMkbXcJzof2Dzfo8g0U/ydMNI7m8leDsUOI9dPJj6GOFKRrrE+C\nNeP3\r\n=G41H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICbT21bb7JpF1b75A1LZzq0wmcd6HuFh7ucxk5Rz0NknAiACc6S6X5pXdqeRYFwWpbxsQJQ8/zRT1PgJ9w6BSvnuGg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190612082450_1560328138190_0.37698544470187767"},"_hasShrinkwrap":false},"0.1.4-master.20190612083842":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190612083842","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190611205206","@atomist/sdm-core":"1.5.3-master.20190611210859","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.0-master.20190612075058","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"95f49bd349c8176c12f78cfe39c0fd1d870b5336","_id":"@atomist/org-visualizer@0.1.4-master.20190612083842","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Gh7b1dtg7vGG3O7NrQt2hFQQiK1xRdagCy18XIQYJ2ZT76wlXcZFz7NxQEh49UHSGSOFFB6SqllabjPbFbeR5Q==","shasum":"f270dda9a848defeac699c8d3491705b45b12f04","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190612083842.tgz","fileCount":153,"unpackedSize":866154,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdALryCRA9TVsSAnZWagAAnhIP/0L/toeotWPKvzJMOULo\ndwofu2mEd6x+Qbe4tJMesvxmtrjyhBBnGYWWTUAnBRqYj80mvqfUsrhvP0/V\nXMmAA5rCc9cC8Ej37VW7adc9rnUr6CHtwplxQp5Dqnhxw6DRq7rQcX5NHF15\nO1nyOPTdbv2sxefVylRjuo18AKOqbL8ac/s8qEfNCGc75Q02KNqUqfcUTU2s\nMfbSpvmNpSbN/5c0Rb/vMN/aUmFGCe/EpRU0aH4jactEw53V1JeEhb3U07NL\nDA1UFvtWyoL2HJlIv2OGHf+v0+gFwEWNJslDXS9CVVmNtTYW6QxaEHAiExTq\n6QKCeVBZbvCP4NZLXJhVd8JvpM9Psky9cNsGpsaOFdFlxfUvcXKCw74mbOZf\nPBHVdVS66bXgoBgHJtnOWhH/qCBM5gUeUdG6wcULQ0dNPgBEcb5byHItLYA/\nm/K8zfV8dIp5ttDYnrk1ErJ6VBh9FLwOgSDhsznQpnXya5N6bFm5BUEO71Hy\ntPFnJEiNyVYBFPB6qlgJ6pYvQOaRyzqj0wVWBZUVxquLrNdEmk0GEM9wv8xe\n7XCvVymm4RVqE/3l3ZerTk2KBbRYu/Xt2RrtflIdTFtgfFw2/vjMRLcHd4rW\nf18iEup/2zfQ71s0JaQk+IREkNDLSSKFq2J69E9oD2L0qK/jOxG2RdzEvDwl\nds78\r\n=eQ/V\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeBWAtY//BsZ+8z/ii9a6Zve79OvOrREZALPKnEYt69AIhANTSoW/qvbSbZgG0jYS2L1hgecnVX0rN94zrBOCtpL4Z"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190612083842_1560328945816_0.48324579709914417"},"_hasShrinkwrap":false},"0.1.4-master.20190612105714":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190612105714","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612102726","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.0-master.20190612075058","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3263d16dd9fecb5aac303fa42de9c31d7f02d60f","_id":"@atomist/org-visualizer@0.1.4-master.20190612105714","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-UzgZPV+VDRKOJxHSbjF7686IRvQV0rkGGTLctGOczPLwDT+Mm0qI8fMTOL3iv5TGOCPiQ4qNlK1S9398K+F90w==","shasum":"0f1343c813dd49c5ee655caa25627bb50b3528ca","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190612105714.tgz","fileCount":153,"unpackedSize":866569,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdANtfCRA9TVsSAnZWagAAP44P/iwkVfJ8vnFTG/tYBBx4\nm8JdhNQHkabAFdOlbKB8axFRDjSmVWoWovZr2fIwTHlb29P2hTu4D7hkgkLP\novuXnc7XVq4QZY2quveLYEY2S4b2PvRRW+xT0S97lehTigmuWkItKzKXfhVe\nVAzMQxQto7a2JP1Di5AasdZcIUX0qG+DE27bHQ7ZpqekqcpqMS6hi9ZMWX/r\nUVLI0YReqRNBqUnQn2EA0OJ6XzvBg8UH8dx74BG7SK9N6z8tq1MP+c9WHZnX\ngbfCXN5fscQfFNhtPVT6vR4PZfpZKsQozJ4iOPVqr8goepdXgkhb9xgGA2ct\ny2JVNSaqTTLVnc+Kg20od4nbW4EUccxr1R9CoHCrPJPzAaZDgVG2IIQ+xrVj\n0F0OFiyo+AYkxLePJ+3+p2wXS2QXZcErKY7EIVsU9E1L7ep+TTNCpaz/rOmN\nmKL6Vwr8YswsVSwmCc8I21/EytZOVmknnUcecJrB5S3/QIxpVj+y2FQ23h8s\nKHhNjTgFrwKmJNd52ywBnr5p2AuGJRLPYTVp8k+G2btFoWwfDPG0GUXL8v/D\nZF1PCNHYUuCzwQe51QboIQJ9CywD/X92clUugtuxLUPHXEmBjJUmxm+SdbSo\nUeXYVgI0Qc88xukVY0l3788NGc8ZOyrNgIv4A7R+vBoScvjtVk6Bhzn2esIO\nJQ8Q\r\n=b1jr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRyJCVmCNhFJ7R3/TotbTJc4AmeRXgcDHJ5oqtjaZ3cwIhAIlEcO5E/2f8h1/slz9e3kUac8LUQBi+lV3jNe9hN2f4"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190612105714_1560337246292_0.5584285352065881"},"_hasShrinkwrap":false},"0.1.4-master.20190613033822":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190613033822","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612102726","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.0-master.20190612075058","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0c1d46c8bdbdcff0c5b21a5e3b7b349147cfa3ad","_id":"@atomist/org-visualizer@0.1.4-master.20190613033822","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-vKnUjc47WIqHk1vimDRKJABHEUYVWotbCBDRFNMb3jxPltvzAu1xsqOJ5jokBN7lIP/QEtlY+FTvFKmVNkel3g==","shasum":"a692e4f5c2a13b66facae660e4c38fd471520902","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190613033822.tgz","fileCount":153,"unpackedSize":867427,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAcXgCRA9TVsSAnZWagAAv6cP/20EQhZpAnnlnSQBR1eJ\nU2J7UsRPgt4nqHKRrqtQZ2VQ9KiL39vyIn+aQ9KwhpQ+k3U3DPRrINFaXFxb\nsIbyqZBOuVesOYjFw9Rz+CEqV3jaobiY2uAuneDHELZOCsjOl/+oUF1DmbxI\nJu2ba++JxOqVaPKeXhY4MXCx1bJtyCrCIpnQQBaegRsIcnZTdBci57/nIN/h\nM9UEudLfhG6Xn+40NllrIidfBa3bXtW4fmAJW82jOX3izDGXhiQBRRMrousn\nVxjIeZIDSv1klEI2hsPpnLHS/VFIFyhxcOJBONrY4SYBqxbz0jT50ANYYOjO\n4ucfNQUJoh3Adg7UaTDoAoU/aP0a3dWCtvNhQ8oMIFfBuIHcuJMqhbFHY2Ho\nF9xXLzoTp/tpmT3D9ByiBvPtzjuMvSAv6NzEBOG2k1bQRyZleHuJfnX22sXT\nrLlmmo9JX5RA4m4nfxNkCRRQXZKODqbg/UyDYts1NlBVWyRJRW51OwinTGVu\nVWCOxsqyn8dM79Z0rt2i2zUTV9ZI/aQygFygYLTMz2RwtzB5zmGMgXI60O7g\n80LBMVUZoyeQmbIpsnIWhQd8BfMsl6oLBt8fyfhWRLrIgSLwJYGxLlR3be3o\nDB7RGlVP+eB/zQw8lLCh+P1DE9FDLwp1twstbngx5dQOlnXa9Qbmq9sXPuwg\nqoj4\r\n=SpNI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEp35PVZ9wv20yKZMoVskwGc5LqpWWms6sAXJpugNm0BAiEA0xTLEWgECt3Ezs/r8UdpyS7E0YJRNd6r36Zq/0GFaRE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190613033822_1560397280077_0.529190827853983"},"_hasShrinkwrap":false},"0.1.4-master.20190613065233":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190613065233","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612102726","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.0-master.20190612075058","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4092713cb5e406d845bb47a1036b207427ff9cca","_id":"@atomist/org-visualizer@0.1.4-master.20190613065233","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-vOXUtqrhzWTW7njnD5rBlBXAelnY5Z3ZYOGL7sIzMfiTPRcM2caFe6hofa7bGnZpd+S9mxCcqO8mOJ21VPB6Gg==","shasum":"6ab3c43c1a55db3642b49602b0f48469cc2f7d15","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190613065233.tgz","fileCount":153,"unpackedSize":867412,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAfNBCRA9TVsSAnZWagAA7pAP/10mJ20I0F/VKmN0Tbez\ncMCrBiBEBbfMMaLnGYsmCTk3Ag3uXTDMmGMeT/esC8FG1H7JbuN8pgs3L7rq\nICnmNEYYV/so55uWsTbvmGSwGjuWmojX5DiulYIeEjwn5A+ZO87mbs3BUwwz\nid7MKUV6gNqRyu0/3HeDHFRpWytYx0dSe/uph4NNcp2BKvpkVYQNnha6yhc1\nT5RgeYAdmSk/jW1YL25z0TBXRwsTlsA1MJztKhuS/bU1ES4pkgIx52TOm1eY\nGMqpLQ4MCzWRtjWYWB3jdkHRBQT17SBuzJnLvx5lhKkMMoY7FXeHX6JoaoJa\nYZwF5th8mKsNahxcCo6FNKgoa+yqDnRLuiBcgdTUpXssHIgTcTjrnJlV1gp4\n+KnPkCRWVRdtA2QG7JYOWULkvHqrr83ZZ+S/o3upTyl9p+ZW3JeLMI5AMBh9\nGUp2M2wZMlN2q0ng27qqL9khPnPiTmjbZerw+0/Xy9fBh0AdMvSKG1OuL/hC\ntw5Cedw6B5/gF9rNzdUGiuP6Ov0oLsPM2JVjuHmnKpZ6w61BFX1hd9tsvuMI\n6vCSmEUFJliVzd2l+DIcKQHRCQOtagro58g1UGklwiIeXKgPQxxgAiqSrkhe\nGuRfaDsL1SSMQkOipS7my5yPmzipOUKVf2skDT26NOxmsLhFStqY/FFWC4n7\noCtQ\r\n=/RhT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC86asDnnnh+rnUUf2K+sIlYhMDbeS86afCb3E+k+GhkAiBw+aXvPViKfEI0h5Jl0ybASKdg+5oie+wtgKzPDQURyg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190613065233_1560408896786_0.3633755401248182"},"_hasShrinkwrap":false},"0.1.4-master.20190613084625":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190613084625","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612102726","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.0-master.20190612075058","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"12865c3b7c96b7a9d61a8f54e78025d6ec6b2088","_id":"@atomist/org-visualizer@0.1.4-master.20190613084625","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-W67aGqnzyy6RJOMByDK8dEKpGcFzpugoef78HdwFqxo6KqIp2Lql5Cq4150XC0M3Tk567hHrRk5BQ5/hehxyzA==","shasum":"d6d3e771c396f61c379d3d2c80eae0b3f0de3f8e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190613084625.tgz","fileCount":153,"unpackedSize":867041,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAg3yCRA9TVsSAnZWagAA710P/25L6cYvzTWUWvRRQ5VZ\nJCGvbfnO1CcPXJNwqt0i+iPjQ/Udhde7grmWajaqxlSVkOGdazYl6VIuyzFk\n4M6X9zNBY4pW9bum+G3ROWp0gRaXwXjeoQdkyC3GWuZkD9CTEdAsG+sSwNcu\ns7bhk3OYmfTC7zIMZIntOxVpql/VaNZ8gDIoUsBSZw6HS9xSK3+hNcAKGVM0\npU5YgnQTb4DswEsn1aQdGxyNZnfqT0Hz5d57/h1AB8YYVxymAAoDWuqyHwMa\nuEvICM8KQf9eyiX7JnLSPNuRjGZARiltkiqHyIOYhxQJwROnAVWHAkpORAlX\nRL5rAWutVSMPhP2CDqvM+dBt2objIEP7L5fe1pnfeJS7wJGIAWN/9gM9jaei\nKRNA5/IPVZuqM9kyQ+dsLMbq5oXMCM7omZrEVVO31By7ZYm8vsLcrwMFMozD\nvJ2gH9lY2qMDCe5thpDqkRfUQa9MIsRNTcLSzlue8xmRkgtGWfvN7jkXN9oi\nCQl4ovogkEndMMXQEBcpLy393hoAHwa4hFDVzUcBFuTy/EFiZQRLRsbLgz+l\nXDnhuuvaGkcFGOcCVVcybdoMCelxatwSJAssPLkNz8HUgGf+fPWl8F3kv3ws\nxoA8aGDzS4I4tHks1bGVYYn9h29ROpBSMhbC4m2f33Ur+JDDr71auGywMXas\nmTq2\r\n=ZYUI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRWGspPDwOjNeiQ3WstYo6WNIHEZEhNSXh5Hax8GYPngIhAK+0zANkIfhx4dALrROYHu6QP1fDp5ERWNda5PWXafe6"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190613084625_1560415729610_0.7590479179688683"},"_hasShrinkwrap":false},"0.1.4-master.20190613085454":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190613085454","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612102726","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.0-master.20190612075058","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9f5c49f5cc36ee14e958f6037e22c69ff0dd6aab","_id":"@atomist/org-visualizer@0.1.4-master.20190613085454","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-KtHLaXduEEHF7Nd9hNua57Yh6PfxhV/YjGZQ5kpJ+h2Z69q/oi5z+D+GXmcSIGny6x12rIr1kzfj7cazlTfOMA==","shasum":"5e3b8f0c3338208b9f13ab0461317a0f327add5f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190613085454.tgz","fileCount":153,"unpackedSize":867625,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAg/UCRA9TVsSAnZWagAAx6YP/Al67sGkDO9+n1lQOaC4\nXHIS050ldkf3ZOgeRxZiKyfk2GyNHnT9o22PTaV3qZkKPVBS5esvqeO5rBNY\ndj4XLqNRhouSDGrldKr8s+rtO1OOkhDF7LCpIWq8NGYwkDWnmefgH/iwLvEi\nGEvmic25eF5irx4Wk2W3+S3w6nphKTqhqaDdpE5sn+W4I4lLvBnE5pXLyyKd\n4qin6+gLEMFcAFAYPQuRyqgd2oS28eMMPnDnpvjrdDZju4D2CHNCJ2VX/xk0\neQeSXvxqjT6OnqaRRC96zG66Hlo3zew8EdxuEsSdGaL9JrRDFEvBlfPrYqWf\nP/KLz874hE90I8IJw6cCrWnPHBu1cxGBfU1NeB9P7gmBapyNqmPp5Cic3Xsv\nGDY2bnqdillP/675DHyXxa/H58Jg38xZrRH5QjGLvuuUZIH30vej+2FHfjJd\nhnBmx22ctX1GcQC48V68vpygroJbRDaDVsndKzwJNcn2X1SPfC1VnS05KigW\nEtJZXy44C8qswbkmqdavqvKKfBSiwRNDxEabxrqgYN2638JUW/u/i4mOViXN\nq1SLzRXGlW4h1gTwa+3idB9s8FbqjB+Wh2bjxvgvjSJ3zMizLzuH0hfF+fLW\nWRgUaQYY26h0IlfmjnF98/qMl0FrQJ7KJEPVgEnYrZmzrnPOgySjw1nrFkKu\nGyed\r\n=UTpn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCBCKvoeBXzESuZc9L6rCHGiNmqn1dqVtgzKCvDYrEtEQIgAc6sCAXKY9RqT0kH3cFtCjd5uUVVx0cuMlwaZtMrz7M="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190613085454_1560416211499_0.7139677728346203"},"_hasShrinkwrap":false},"0.1.4-master.20190613090633":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190613090633","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612102726","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a3ac2a8ff93605aafc41b5bdc03bac09efe2474b","_id":"@atomist/org-visualizer@0.1.4-master.20190613090633","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-GZTaw/fjb3Hxz4ePf3qmAuCenkZimBzR0S/34/yhp2ELKwGx8b4X3ytI2wdPo+N+S4Im5jGovl4vOOjKC0NSdA==","shasum":"4f30e326b1df3242d10c6ceeb708ca42e47b58a9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190613090633.tgz","fileCount":153,"unpackedSize":869841,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAhK7CRA9TVsSAnZWagAA8gkP/jt1OVdj14o2RXk5ts8I\nYgOXMyP5p1kfswBwMHJ5w02f4LI0LqqMRm2RHjabq4BwI633wRm1nBe+4B4N\n6U883eQkZUjyzuqA75iVj2J1W7OW71S0eQFUK1c8l9RgLBnCmWTRJkruLssA\n5GevHv8lShrVKk7CjCAnpoWOaqex1ZizeZnAzd34C8nGR/22PwteQCLSmvm2\ngS1c0by2AF918xCVAQKZZyQs64Fjn4AIK9+YIlwtMA0zjWKMBXBxEyYtgY65\nkd8VNRV0nP68Cz5P2ZDbxYyZiavc2wojobjlWA8/XcQ02zOninb1ZreTRrCr\n4GDGX1oQA/BhmY+lbdZUPg/br2o2cblfD0cmDY+FwbFZ06ceEv7rqXVQ6vJc\ncd79vdOu7+G4FX2YX/HioGRJ2QQDZqoIXxYXDv6mjZ7EfrLgYe62RQ1fKZkq\nc+IyE13zsKQucTGbMKLeqXACUjD3XkuTLxYYK1xk4Q3AOW1lPUFfgM81eyKg\nD5LFZYN+Q4p/vowGTdC4uufJ6ZTblXtX0YmJJIxt5nrWemNNSRMBjzTOykMz\nUKn6I+C1v8fEA0yo8nTZvqArtZO5Xb6p0Vd+FQNxN5DMQurXyCs01+R+CAke\nudiiIJ2QheGsQdtgvroHMpok0EbnGW9UE+NVQ96PxnISs97jDPoWs/whVvH5\n8lz0\r\n=9hrN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICVr3Tk/STF/NqD0opkV/6SbrENQ9ANWeiXaEaKkD0yTAiBvwGoMC+FWl8ouqPs0If5k5c7gGQZZ9UXlMrHdk/561Q=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190613090633_1560416955047_0.7798336264635208"},"_hasShrinkwrap":false},"0.1.4-master.20190613091446":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190613091446","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612102726","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"43419236764c878c59904fb6e8895e404ceefc01","_id":"@atomist/org-visualizer@0.1.4-master.20190613091446","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-OWUOrjgqiE+ckBDUkkt/ah7UFcraz+JnVrjriJteG89cXJa7ZFcoqefLtSlEqAnszzXKwef3/CHKOi7JAQzHBA==","shasum":"c4c4b50f63d6ab2176ae828ec1ac70cf0b87c1f6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190613091446.tgz","fileCount":153,"unpackedSize":869841,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAhUUCRA9TVsSAnZWagAANPwQAJqFvLuRmhnF78biR2bz\n7s/u01mJ3jbkp1UqDEnS/Mw548dESaPl5BsVl/GzOVsEMlvv6pP4R73n/nh+\nCC1GkEA9dIH5lxNE85tf2YMfCzAKnta/yhSKhFEB1G6x5wdyv51liuy3DciX\ncd7Z8fmGdMtdFtkQ0qAUH+V6qZW8nwAukbdj3OlswNVbbHv3DrjMe7NLSJT1\nQJ3vYuGYXAPTKTVa0coXKblAXzkaaf4nfoYscLfX5rT5n/REIA/DgckOTas5\nf6OPVGIlU41cXWbXj3DG7ZbQV7plLJdDU4BeAammiFo3fg2kj1yyBuExlzRB\nPhwLUP+pth1zFDEj1YlMS1RAk4pRSayUk9sjK0n4Cs+dMklUHFCzdE1a46QK\nFnr6KivOH29Fdjzja/f0c4V2oaD6uQ0yv32ORUQVIxWmjm9CECEwy/mA1nbC\n26gblEJpXprl5w6ozsQ6ilewq8zVKwEIdcvl+3lLmraVNzEYyU9UsckOOF3W\nM7EGhI2SF8RJl0KQ5ilxwZARNU033CaC4h4YEXKkvpkNJnH35st45efG1Lar\nUGDFWUrjgiTKt8aMenvFSg2hS09hgiMDGk/KXJMttNkdQXGfA4AVK4KQ9cny\n8KfOwfPJceJqHCC4Apin0iXnaT/e0yEvb0BxIS1FvdnFxCrK8WN3URcQ+xqJ\nHNNV\r\n=4dK8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB2mxsBViG23ioIbi72mCNQgBpZJRbQUkWtRLnRujppaAiEA5EnTmiue/eMF/QmNNz8qkWJDXyRmiXERp/JBmX45FZo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190613091446_1560417555976_0.9713013295129285"},"_hasShrinkwrap":false},"0.1.4-master.20190613092723":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190613092723","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612102726","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8d89edd9296afd2e85380b74abf2ea6f1007036f","_id":"@atomist/org-visualizer@0.1.4-master.20190613092723","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-imygz2ARXTV29HdSTE9fptZqGngF4aDfNzc6oFNafCAVs22Edl6PkZZchUKK/m9bn2IuMLEQikc86HnjhAPBQg==","shasum":"dbcfcc9e5206f89b4c4744ea7925b8ee04d66cfe","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190613092723.tgz","fileCount":153,"unpackedSize":869841,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAhd7CRA9TVsSAnZWagAAsAoP/0oBG1gYjsbllayIqoLO\nMBJkB2xnEcGNe01sRVJhtMOZXS3fyNAE670KcYoEfuVsCUVA7O7sOTsi02gG\ns2xIQijYIjlOILsYxU+ARGkedpOJa1ponO6YPitzQvJ/TEFr53qxJIEdrSaa\n+9qSGF49Ajl6q3VS4yEH8Q1rxB1y1p4iONfuLU+YlQj/myCCx7tTcXmS3qZc\nUxFukRVod68puM7lvzaC5ujM2TGFbXDf7cB4FjEV46lWHeMoGnOF9Y9xbBqX\nkERb+TrMJ7jYmsLqnQyeXw4I+mrP/0q7A3kYJ6NQQ6qs5Zo2x7GcUzGhsRHG\nKAANpukJq44Meol2jB1WnsS96ONAiVmdZKlx5g2UFFqBZtQXdpgE0y2jHTao\nEiClyd4Qg58vl6Py7CV8oK6f0d6CDXQIUskbe3CbfpJszQoZj1XOqppov2ub\nXhjbyNgcGObL/EwPDI88UBKnlDYTHw2WB9GiVeOcCNoQtyaYAmzu51XcA2G4\nD78g6kef2bTCpFC7ccHEIqszDRT2yzb/gXC+sSOOmTbvSiFDhNjemIcnzsip\nsDq31mnmPhHsO0f4tTZRQFuaWBrBprE3++quYVQAcTIMWbvpOH9pAl1y8QgZ\nkY8zrgqD6eK6quMSrjRFRmjM9XEVXZtLKMSC+44QI3aYLbsnktRiD4Qu/aC5\nc3pT\r\n=Vawb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPkfGKyQk63T8Rrqd4GSVfAKVEyMn1/zXsrm7dWAEkwQIhAP7NoRpcvX8VF5NE8SZeXxi7sUZX4Z3faFIsTIYSXHsI"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190613092723_1560418170512_0.7898064076959626"},"_hasShrinkwrap":false},"0.1.4-master.20190613094251":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190613094251","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"285106d9c7f44ad413e8deaec0626ca0b59350e1","_id":"@atomist/org-visualizer@0.1.4-master.20190613094251","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-uwFNqsgjzR4q+hPCBXfZe1l3Irv6UaApK1cNlRJOYOtV14aexgjgQWt8RuGxjAc857vZzIaDYt/sfM8Xzv22NA==","shasum":"678e6caf02bb4a6353c1b02ee27971d3e49a0119","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190613094251.tgz","fileCount":153,"unpackedSize":869767,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAhsVCRA9TVsSAnZWagAA1wUP/R9NzDSjtbwHmpXkvYuB\nUPRntOvdvGWDn4250A5wc5RcnbsguduJHacgSlIOL0o5RW2NX42SFT1u6zRa\nvNcpQz34GZ7FdiuqAagtlV8b2v3TeH9eL1/x+22KHLZBY6VTPxk2se23kg17\ne4gfIguV+77CuEiCWXFvVH8OWiAGTj+6C37QJp5bDAE7jbzrIdyIBcq1jL3f\n6WUE8+OZ1HMNu1+BxOTzcBeIX/pr430gjos9yzWhcu2WJPuXOsLargbSAlzG\nBsz70ZR/ATJWujf471G4wRFbkPYikcVVegfMuSuFUCXmtRg+LgIQqzNF8k+y\nkGUxKwDeNRcxsGdzSwdEZjFB8xDZoNVoFbWnB/cPCBZRip5tCJHepHv/EtKM\nJf78anN0aU6r4TzEJI7aeUZWLteIhXE7VhNYq1t47OUlPXhsvGM8beRgP2pA\nNXCm0O78vjWuj/pw4zonFVSB3KyyEaX26NPFvTUKhKgCHxQRathm2VxVGe1q\nZ2YUBkHNkn0jZmezjZWDnMUlw63s+2RalL0DlmWhoRd+kkrxDOlXPnFkLXEt\nrxeh3jcZA2XXLgxyKyvgzNOVargnRKICiRODsDUG0xTjhN5O0ACBsLlx5pKS\nW93JS0BN0+HZa/3maSCtiqTrsVf4Y1Ylh0MJjxU1bnZ4VdyHqTEYnDvN0OHS\n9L0z\r\n=eauH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCihGjfykWkELwkHq+A2jUwVJqfnGzWIa1KDq4r3Xwn/gIhAOyMlVr+bwT6xgwkwGaCPpm4yMjpdX9EtNKGshhP03Cc"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190613094251_1560419092894_0.31083153310610045"},"_hasShrinkwrap":false},"0.1.4-master.20190613105852":{"name":"@atomist/org-visualizer","version":"0.1.4-master.20190613105852","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ec40a384c3c4be928e7d9d5f59131f9da8065024","_id":"@atomist/org-visualizer@0.1.4-master.20190613105852","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-t1EaMVawfwdD0L+Z/TukGyS+LAftjYl9Na16RILhXHcAHBry0aE8bvutJcVVxPNPG4AXVsAtcQw/vGXUJjSA+A==","shasum":"963753126e3a2770901c28cba3a97eb73a1b5632","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4-master.20190613105852.tgz","fileCount":153,"unpackedSize":869763,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAizhCRA9TVsSAnZWagAAkT8P/3vKU9AILk7gIhTkn5x8\n/ba9MD+yta96cYPjUAu+U3QeLoxGXzee4vMcxYT7SdFNdGvogDhQf9RDJjtr\n1WS0Ef6yvG3hPUkkht8ISv6HXKK3HpB73BV5GN2ikWnDTQrcHh40sW+lU9lz\nnL6ob03eT/DDeI9bHJMB9brAuC3kgsEdQgKa8BzJVI8ZQzz1iU3NbrSLlh74\nT486Pw6kl7LiCU/kQq7+jkd/61eVlkmipD1yqd3G8J5JxtsZABZU5qT9yPjx\n9ZCOn79Q6oxpxWf4HkBDkroyCWk1GgwWCS2M/tmDQxg8Ly0wytE4WCGFzVCS\nbT6GP3cS5IvHxDC/1omK1uoqHCEduekKFr4cg4us3Rbp/LaJTMKN5PMOuiuW\nK9fdXntcm6fFwTuRv2+RNYGuCSrB/hIh6xBe/EZ0zbHgF4d7UXqEJORad/1R\ndSUH/b9W/ZWk4E9vpTthum68xtCufnXE8XrqT1124vb85MZu4y3Auu9ACne4\nUNl2Av5AB33CCWfKlTODwOIqRqNIOsX7wxkfZ5jJSGxzZcEj5fxqx2RiixSI\n6dCvWnf7hN6C7Ql/OUV0hj0Yz0/zuU0uVoj3TJE8AqpjLiZzYNoxAiOW45Wq\nwyiHhhNTCmdTwElx3E18j8hBbStQVrXlAjLKiSzSE0Q48B/sTc7Mp4qNUKCj\nNqgS\r\n=D6WF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTB31puWethqlUTbXTjQUvrCQZd89KW+zDE2Wudmzd8QIhAIydTpG4lX0UEMh2nzCnjJCVbpKsdAS0cFZVG3BdOjb8"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4-master.20190613105852_1560423648386_0.12151616909861973"},"_hasShrinkwrap":false},"0.1.4":{"name":"@atomist/org-visualizer","version":"0.1.4","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"5334309ad12cf044c30996b1ab41b1429f7e9c22","_id":"@atomist/org-visualizer@0.1.4","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-x/Ifr1J5tL2/lscUf5ULfteVFE682ZMDAqfYJq1omyi1DiDU3mrZ8JFKNd9vKt3lOCY/SZsoz0ECJrgLdeNzug==","shasum":"e59dd34a59b8ddba47b0ef85c92015b5faa5bde2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.4.tgz","fileCount":153,"unpackedSize":869741,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAjeuCRA9TVsSAnZWagAAD74P/36VmsusFavd3QJVU1EP\nnM6oY06vewDVH5TdN3i6VmQPEuK9oGXRoGp8LkWTmyVcXLioQYhjLB8ac3Qp\nJe7T83cAfCNmWsYdsKjXIwkpLt1h+/wlVJPgRywRKlnTpUaghCxO9Nn2HL9V\ncKjjmxanfGfmJAiSLXcYeWIP6zawXb+7PJ9JLnOe4IEg57WkUMq4M/nTxvYO\nl8QyQlZOwCRhahlLrcpK+e1lFk8amr/+lOLRUnGfnnonVUiLZsXwXuXjzaYE\nDXVUxAsAGs5mQI9q5+wYNaIhGLwncFua5VMakOWwIrKMUmQk6R0n2mOjURud\nZj71GBjoFJqDRhzWxPcXcaGsiFJpAJ+J73qsFePe7YQqFeGJit4L+Wc/aLy9\nOFJ5IYgSEA6pztFSF1TiXQbSERnFRNbWgzRPcleZ2ULqzj2HtAI37VmbRdXo\nbB9zT4H/g1LmeATDTYGO4pypjyOu31wbH9UQXDaN+ebi/0Gtr/HJHGiPvKVC\nKZrdxiYA4w1frMKZAD5elB37uZduDlL60OhVBPbwTDSq7oIgtgKaAVvnIShf\n/S6YUQHAXVGcDzdiFL3tmCIdl2MrBJ1i6g9exkD4dV/JB3131u9FmHpuMA13\nzACuyC4Vp/LI1HeynFvucUp/39dnzTtlmQY0RN7XyCL3SJ2rFMI8KB4E8IGk\n2Wpg\r\n=Nbdf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCuSzU6axV8d7I7508QUsDtaby6GHHSB3W1E6W8O5TUeQIhANHvChfQqOGYftsXLToP0RvQ4JI5MnzrbJnfYfCXwhVY"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.4_1560426413924_0.6102921855444519"},"_hasShrinkwrap":false},"0.1.5-master.20190613115636":{"name":"@atomist/org-visualizer","version":"0.1.5-master.20190613115636","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f5eba079f06b83547273a2f320e19cfaa1534a6b","_id":"@atomist/org-visualizer@0.1.5-master.20190613115636","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-VS049/ydSeAGod7ArMgNqywddXEm8/xAvFeyAa+d6a6k6O5n8h/o48k/qeyF2DpFPB/qPgr1v/MmZHY/Jhmxsg==","shasum":"9ac9c4d8a2aab3db11c350b314f5b7b1129053e4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.5-master.20190613115636.tgz","fileCount":153,"unpackedSize":870099,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAjpnCRA9TVsSAnZWagAAO2IQAIOppz3wHaKiJHQu6R2T\nPtQchpN48LB23nl6OJnaoBgOQEB0rpBbaiLR0hLvadvvIgZ86V9n3qbnwgBi\n7A1fqGqDgVtH9GVw7zAWMF4BfkSr93az6Le9Q0qofRaB4Q8kIGFruAYBjOE9\nvQ+Q16cd22KuE1qBUmFf4VKekCH52a2ed8kwQU6jjDRsx7OhiDVhCjK3RW3G\n8e3V8UwP8tcKaRsyFH7eCgwXlI+3tC7/zRN567AWdZX6ltpWbJqVDWF+Psy6\nhnnCKrczA0eRO8q7OLziFHaEr7aBCIpPWjOaz9froWTcmZNzJswE6srUYZgZ\nZRWXPcktbwkLwFplQaafP8ZT/41WPylMVrP9tUdpUHDOD4QZ1AFrTXSGm7gz\n+Eh8H1lK1YDiv8a6o8j4xQu+oCDXUt7PblgKrhDgc/PS60UMdPMAvNPt5Yxd\nfKPlS0FhqgiKvdgtHJGnJE96sNhMKbnK2w3lxJgE1jlF9XxDl9XMe1yRu9xm\nMp9tGC1u4ZyOcw7gpRDdoPhW+zpWDqRbXEvlVX4ju2/0498x8QACWnZtCnAQ\nKI9/GbEyGIsydtROYg+aNV4Xn0y+LJYhu+WprBi+GDaGU4rN+qQBImfiTv/l\n2n8BYLTIhynu2EbqACeD8H281Puh+dLVPCmswVFevnVEZcM62lqU2V9Oqksr\nLTwd\r\n=HOTu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDsIk2/54zuFOGcfVfyjkzKbfFWnAH38AbVaKsK+ry+ugIhAM9Nk1XNKAiBvZA7liOCiTnDMwIpB9JXkRu4vKQbFsz3"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.5-master.20190613115636_1560427111075_0.17766651004030365"},"_hasShrinkwrap":false},"0.1.5":{"name":"@atomist/org-visualizer","version":"0.1.5","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"6525212419ec13c6681bfb3c1e63964d29a88ff2","_id":"@atomist/org-visualizer@0.1.5","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-BygsSJx07/UQXtciFLDGDEYuY02ueUkiTKRAMHh21my8tg8tVp0LIK4id/26X/vQIz7mcX8U4T9qx1pbXmyzzA==","shasum":"5160075846227ddc6d480496c84cd1b00858c1d8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.5.tgz","fileCount":153,"unpackedSize":870077,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAj0GCRA9TVsSAnZWagAAQh4P/3aP57hG+NT/PQ5qQ6h4\nMf8LpxkKYzOOZp4KfK/j3/ZVE7P0WvSDJNlmegRbd8Mus9Vpo23wzhYma5XF\nhCKcstztgXssgaxklnoRNt38+/MQAI7w7HobqTKir0BgqizqHZ/Kb1mqM9Qk\nbk7seQG/G4Q++Rrj05hhCdg3389MxBLoOrvXmZXNtppo86JBWO8tRkZkYX2u\nqfmK70pIDaPlTpEZp8OsGe1/Pq7HsenoeFK/1V6YqQDWlq+hbqrWJTq9J8Ne\nDiUcFdHR5byJPIk8GK7S1DDUVWwIMOk9VF6wfYMWqKqd4VyoKrtyfYQ7NTim\nDlqGmedPJXvGbRQCbqfozWPiWooUmmMUgdrbnp2OiHRRx2MR2NpLpvdDlUQ1\nB8fcOsOMeWb/IyKJcW+b5dSvjPJ1m+D0Ct35VV1ExFhZSh3GB89cGopAR+8C\nJoChiJ9FtsIRTVnXkZyXm5jbiPu8b4JWtkASAs7A2CMhgRHeC8GDdq8cBHqg\nsWcuh07gLfgyVdGqknoJPBfZpxvClXiG/THHGE08m0TUb4WyiqtptDFrA4Br\njwMTttSpCbn2pUO+Yy1er6oXEC4Fw+H1HXFy6SMu5sk1IwosplTTk0FdZLtq\ndboqMT/wr2CBzwOsQdZunosQvOXUWC+Jdb4is07fnJDnbPgPrr/FXBcmpYH+\nJKjL\r\n=QugS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC0NH1oc7KXHi9u8zCwoq3BPdwgS3NXi/CUFD+43DEBZQIgeezcfbsSH/ZfrTIciiVlUyfysjr6yGWxai+HP/dEfbA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.5_1560427781776_0.6466504202761592"},"_hasShrinkwrap":false},"0.1.6-master.20190613121716":{"name":"@atomist/org-visualizer","version":"0.1.6-master.20190613121716","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"38ca3fbe674a918cd57417f20fb188cb2d556e35","_id":"@atomist/org-visualizer@0.1.6-master.20190613121716","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-sI03XrF/t7EiywpYJkq6JBj5Ay/fXwkv8rWlmBcVt760eD0UqmaS0D5tpIdJawSCHlIp+YSI5U+EpQBhs3d2WQ==","shasum":"ea19feafaeac794f448aa64da1765067bafba182","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.6-master.20190613121716.tgz","fileCount":153,"unpackedSize":870421,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAj9CCRA9TVsSAnZWagAA7G0P/2+gASUWj36JGyCWo2Tz\nclMWaFjW75aKCSpV97T7RefABTxZGimpgui1mkPFTVTDd0LlifE6kg6cCKvE\nEVdpZbWVcOO68a9SIr9kOIKyhB+SIu1Qq7ycujCP8i3hJVu36HzZrGxO8mXC\n57PHfRhGUTWtGxHCpBcTduOixOUsliaXGvXF4QDMCVJfnbq+QVZwq+zl1gcn\nyRSQ05DxDQlBb54z9GKvvMOuaJ/DJaVH3nSzWMpJNjpuCl2PGZC8HwAlZQLM\nyNMDVhNX2AAKzMqlc+tQcnXgllot5dp6X5A0ONQRyJq41+IK/48i1FwCv9Cn\nlu+uF1ojV68CxCzznkEyk5e9mjxZMRyLDZI8b9dCy0VGgV454O8z68uNly7L\nRYklJWpDh8xUtv3S/ZiuHCEw5KKmYDYEQ1N+uqLd/XniyrtIsmkWK+arh9N1\nEKDUBqqccFo3w8XGC9/m7tLjmZYet6VNGg8J1o3eKqrUqvvPo8sqCCrsLIGf\nHPO1MQcMPkQ+YI9YCTR+2umpzH+643FD6sN+ZeIbE2dKb50cVI+kEEX+C39l\neBZ27GP/CEIQKgxsPB0iQ95Lt4rCaGwq4ziyZnNr71z0ANcE3WCzWyUiSs36\nk6QPep8MvDJDJRUfHiihhp68Q0HY4mEIfK9T5bXXFd6T1YexSp+uRLg6TqBY\npLsr\r\n=N/4Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDo+PwJmPCOMWzusLG31gy5Cpkl555sMzkCAXv9lQsXqQIhAJF0zdpqy2wriBASnPqVh7vc2OYkGu9kxS1z79jodoQY"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.6-master.20190613121716_1560428354020_0.3903778779412417"},"_hasShrinkwrap":false},"0.1.6":{"name":"@atomist/org-visualizer","version":"0.1.6","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"520c1b2eafb9f9a07e3a4653c4d0f26ff864768a","_id":"@atomist/org-visualizer@0.1.6","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-l/Lg1WNHmaQc9ny/egCNvURjZMvsiz5CTQ6/6NZf2lAr7pI+nq7axGVt3uZO4x7h8k6vvpKbXuh4rjePuI9VMw==","shasum":"37a2145912c3de71a4a9f45d2dc5032f3e3fcac4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.6.tgz","fileCount":153,"unpackedSize":870399,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAkAjCRA9TVsSAnZWagAAbDYP/0HHSfeZA8eXMO3idccR\nTx0UIpTXt40o9tsDYSxThrm7IAq7fPqmtZJg95ycO7m83262Ss7WcSJ37L03\nFPyGbLlNDD+g/Yqplc1g7fRSZQ/n5ARvHVNmBUwqE91/jOfQQ6kVx2WD6jvl\nmuoWDk/lfmeuihgb8krZ50eEsttRb1GOvcT6ouf++NyiKor9dDvmfHMwaRjm\nMvF8PT93Up7afci+pv1DfDsTybvNeg9ukUeOuHLIwKTjAzeVNu1mFzk06sYu\nKBXkjehY+1gkVg3TpD+lrmiLzfp63UsLPFfic2If3BEstvxAZVSPw5c9jV2m\ntMElEGkZWB3lqM2uUYYX3sysupjSdTgPvrAAHnV98RlOTEr4ca2fH7Um9UbC\n5VjGAMu8vqDFuqXMMpBY58jUyfHu20SZcnSLhd797f0GSkN8bw/RwQkE48hE\nddXmYfE960JiisGyiEltFlih0xWfLE2G0LzgRH51krwLFEz/Gzw645/wtxCy\ntWZn1xWwb/WKSzEEVA7C/fwfehCF69P8qg9CtBChGPoUjoSc9NA4jiMvvh7R\nUsPgH2WtdlEtvHW1ndvYiMzHaGQteBGBfz6VFVeUi6zkH8CHR2vWGFf/cfuI\n1tFxZycyqhsABnI7eErZEiu5HzFbxiQlMWEwomOV0mfU826YL2kzVX8xctLK\n/fEQ\r\n=gaZL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB1yDiMyeMrWCa6oPrwiH63z9lWjCpRZp0EzfNStk0skAiBK+54lf03hNBg5VWnzwEPq6tygXA+cNT/hsUMz6/K66A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.6_1560428579279_0.5360850126148351"},"_hasShrinkwrap":false},"0.1.7-master.20190613123029":{"name":"@atomist/org-visualizer","version":"0.1.7-master.20190613123029","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"dadd18292701e2c34a57f5590f7ffc26d2e45dbe","_id":"@atomist/org-visualizer@0.1.7-master.20190613123029","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-rP34/d4Ek4Zr0mIs2V0o9FIr5HpqmbDthnOBaCzIKUH1lyY4E3z1Gg6lsJPKBkqxMsfX3YQT2kfQzJqKDZH36Q==","shasum":"ec661c1672994577780636e6a8e544853ad16482","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.7-master.20190613123029.tgz","fileCount":153,"unpackedSize":870590,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAkJZCRA9TVsSAnZWagAAJ58QAISx+g3gj5wDOHbdWdUi\n6w3xn/MHgRajOh41L/qd1oYGhDRPug0MeCOasCj9vljuOR/gv2/fMHoZZqAf\n9pFhC5f+A8SmiuOBT+qIOtC3YljCGLiJpfDf/Xdt5uH9YlMEGK6ph0fyySts\nXEzCXZN+dqjZO6OU4FdlQRXL4egqjufoutd756zi4GgIAiZpYrfNl1HXwufd\nrtYqXk8zLcgBtAghJzCT3dv/wuzJAn5yHaI40PqfNlesu6jKWOBaQEz9meBa\nhBcIr44wDIakQLmZRRfkZK9FQldy0TZSLq8HVXG4QIHx4mcd7im9te0wPEml\nZ6WQ6eiH2Ei9HdkhUXobznFIFv896ZVedh0IsbEk9f/z5TE87UPC7zcTga8l\nO8qelcp+eXQOHRvfKFi50T/YrneY9o09s83qtAxOBdtS0RefnD7dLXpDLVLM\nQS8CgFh0ITipXA0hv55VvcqPiBPZ0ljRJ/+fh/+F5JT5lv2fA4cM83ymfec4\nmOBcw2nk915JNyOZv451/fkvkBEMGmvQo2WFXU0SO+1zN2jSPicfZqbFpXmC\nake8L8QwRzsVkFMwXX8sGobO/t6Om9l9e0bwPh1IMwz3HSBGU5lO/eGM5cJH\nNkCiCQiWmZk1OPGXWGrh1mw+n6LohZbq4TJKPfBbRh3sDMncVlcT6BNqFJOC\n99OY\r\n=y4Zg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDCc49vyfrsSEuWOXZnPgRtsWMXX1bmscfq6Waa0+v/nQIgO2FeHecGeMk1eG44sE+VBDifAccBGuTh9fy811rApoo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.7-master.20190613123029_1560429145286_0.4507295464591994"},"_hasShrinkwrap":false},"0.1.7":{"name":"@atomist/org-visualizer","version":"0.1.7","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190612103515","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"c8083576832b8558e2912344928cca2a13b9f861","_id":"@atomist/org-visualizer@0.1.7","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-L1G3H3pROPLK09KtW3PX4PFDPQtYv6nidKKuW/BJsx0ff7YS2RqgLITY0W9NAaWxKa9tYpXQ9AnnHlUejw+WEQ==","shasum":"e4667f655471bbade522811d7019a3d975c758d0","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.7.tgz","fileCount":153,"unpackedSize":870568,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAkU6CRA9TVsSAnZWagAARiIP/jP5sYYrgA1aPNzEJrB8\nu3zkUlpyPNBWyQqdev4Tlle2Pf+FF2tIo1ik/q3RO7NVokx+ph4v3r0kgxQA\ndELe4voKEwL4Yu1nu4IUvDb1YZiO5RYUx6xU4yj/QnJFJhsRLg4bxmx3aGAy\nzIJiPfQrGLWVQcNtqFbQlfi/Ug28IKRJ2BDpHyz8revkjhehEdHy1MXK6OUn\nMXSDg6Iwg1VaMHsRrYB/37l4qTjWTcV9LDc7saNPvkYQUCO3GI064b7+MLik\nB6r9KTGO8Qk3wLGLQ0leEWDfCibbi1u8WxQGJuZN5E0zQ1nI1ilvwHtHcfnE\nHkFY/Aco/7LL6GUoAgIL5+NiAu0foZ7AHV33L83MPWX+RDkRmkXMIBzL6d3p\nINJyM8MzfIqnW+itqqNxHO2fQdxKXbAn0CIJ+0ysEoOJYdgOW7FZrXjUwM+J\n5Hd3NK47zRtcLcBg6LjAM4JXk6dJTG7CKztQ0ss25drjdpcqJqWbHXt6dpne\nTnBeYKTCRIvJQzcX11AeMLF4b0sKgfqlEoap1CzXt7b+4T6fmrrZd7TiW78D\ni6muOaaN2nsCXwFhB2cjVLR9xHl4yPNTXzLWW5kiFgaENzwxLwejdEtlazOp\nEd/TrXA1H/6XbnHFTcf95ZlVdZb/kDTfAIdbR0qv9GNTLIZ0QiDzvGAMUDVL\ncTB/\r\n=PYu2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDM5wkff3ny08c74dBU0cWRDkCBuu5RDV+aJ/O1THGJLQIhAPuqvtT0//9HXXLk0+N8TCahUIYUSNjnyvrGA+HXv6LG"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.7_1560429881777_0.25140539362180503"},"_hasShrinkwrap":false},"0.1.8-master.20190613155241":{"name":"@atomist/org-visualizer","version":"0.1.8-master.20190613155241","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4123ccc37dfba0c4cf481d73497c3d269df68deb","_id":"@atomist/org-visualizer@0.1.8-master.20190613155241","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-VFLjrSKIOo3C0Ab1HEa1tpiz314ol1Sa0wvM0fnKZGqQbtTp9Do7V6hOUzYAm9cyk921xq912dxxZxp/XFd/vA==","shasum":"8a429ebc8df2907cbb20c9abb002f5fb88b0dbe5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.8-master.20190613155241.tgz","fileCount":153,"unpackedSize":870681,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAnGxCRA9TVsSAnZWagAAm6EQAI7hXg+FwpCI2rxgCgSH\nrq8+ycDEhdPTOx5X1U3jVlG6cMAbvcqYqendIrIhg4KmxoBysXGPNgvatmil\nEThuyaXPD5VzEJIlDd38QiGCj0ruaDEtvlBWstT+5Qe354eCa8WCsQJ49nlr\n3d7+WA2+8uZsxvBwI7h+bTP5hKYyXcjno/dGIRiIPz7grH+mzxS2V7Ux7vfU\nuBl06O8IEBaLm7D3Q0gypH3Yrs3mUhNDQQod5xF+QI58iGU2hoGF7HxGZOle\nGXi6MI3aI/ucnv8+Js2BFkFesvSrczgCJyreKCDDbpfKFF0DJVDR3lGJCmCO\nmiUee36HFpe/IlswtpQBKuXCap+Hvwz0oJZN0MJdnLHgo5qeQd7zl0/bYXgN\n7e/fu4h7yKFOh0Fl4oVNAC1ZT/aHNfFs+fovZBd83e95GVlW7AVE+NYVlbgi\nABQcumaFn7RjJ3sDOlEfNpyDmY2RF3XC2EP8EnNSMNIYjAnJ4H44D44VMA+s\n4kdCn+VkQKuRjrv+zxgSV2wivK6dIQJlWL8ZsQpSN04Jc5Pp+mQB7r6VAca6\n9yD+Mbt02pzYac7VrQcx42PviqGvmBa8Dcj/sjlOj5k2HZvsiTeCuyU+WmT2\nBFwO1un3A5IXsf6cgf2brYZfnmfMzyeJuil/Lb4LJuMggp6poDZ316YwMf4Z\nVWVM\r\n=okpa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvInQERE6Eb4ory1AA2AoPOIWSXkgghPJvUdjzypV5cAIgebo0gzhFEYmTb+IuWiZZVN+SUQoMiKYM1uTJryerGNs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.8-master.20190613155241_1560441264995_0.20337025327321645"},"_hasShrinkwrap":false},"0.1.8":{"name":"@atomist/org-visualizer","version":"0.1.8","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"0d19371dbab263cea9df7b2e52a960f55b30c768","_id":"@atomist/org-visualizer@0.1.8","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-y2s+l5L0vCQIaq2sTtU+ZH9vfqWZqOhBPHmuaCUFkOIbtnW2PajIzurH9bV/T+NGp4+pazPJ6ZgRp1ztehbf4w==","shasum":"6b08e233764d332388ec250050bee77c22d18b44","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.8.tgz","fileCount":153,"unpackedSize":870659,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAnI6CRA9TVsSAnZWagAAlyMP/j86/csv6Yf32ULqpSaz\nSaMBYpGBohEkRgHpaEfXL4mynl2KRWGfPYpcPII+VwJ+f3Lu5Qd76Q65JOoB\nArojN/x964Q4nCD3os+huzI/S7LorBAKwrk+H2ubOs9+zDmDHx1eBF1e8pHv\n7zn6QdHpH2AEqAhJqXnrT2GHiZE+Ni9BtKGP1XjO10Pi4EPHvF7A/9hZ6azr\nsu7zH6hTnL/ch9raRmYmRh5T0D2w+lIb5MNH/atFTpRLdtThqukwBhVTnZ4s\nRn9FI7nl7cv1M0rpZ/GbpNQBXHcP5a1jKyoPlV6Xgp1LEHESQt2PAPICJBma\nzyXfiq/8HFtHYdcEm4Q3WZcbTh2c+ppE1Vr9pkRMHzV2q3RnBoqWMEkuMmfW\nVQ80VRxC8Q9YgwoQ1cR5kLgnW64q4AxVNan0Zoue/vRTKVlQgVutECMmIY2r\nYo3tx9VFOINZvDBNJWxQDsqHrW5VocWAgdFlGN/M2RbV3ncYRP+rilWHZSKS\nE274MalkixXE+PYkmQtrkKI/WFQsPcgV63L3ddu189JGhP938fe5uVWsgcdB\n2+mLUHGs3ZkmzCvQJzlKj9kqey2+jzchHs7PCc1VKdJMoYdy7UQBbcfAdVKI\nyPvAt6IfjUU/gOmbeGALh2Ye/YF3L+PNKsNxr2BzPGM8lQFFY69QLjnVowqv\nEu5p\r\n=tx6O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEG5bL7DigHrSmizO7e1wZ4dvblJOvH+u/046eczIUwXAiEAgNS1/q/O3mo4NnO+5lU1KiPKJIRdfAgbe0iuUz5w/dU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.8_1560441400881_0.21170003528933545"},"_hasShrinkwrap":false},"0.1.9-master.20190613163449":{"name":"@atomist/org-visualizer","version":"0.1.9-master.20190613163449","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"77bb0e8cf3fc1a058f3cda8f552f62217ae5406d","_id":"@atomist/org-visualizer@0.1.9-master.20190613163449","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-KPtcyxfdXzJ+FLtEcWFz03HeFhMWMWAZTZ7nL4h8q9rIJZBJaAafilo/Rb3Wjqy6SthkU4nyuQjHZ17rSbvLOQ==","shasum":"b476f841e92bd8e844be85cf91377406b20faabb","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.9-master.20190613163449.tgz","fileCount":153,"unpackedSize":870816,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAnu6CRA9TVsSAnZWagAAfDsQAKDJ/pFObot7sZvPPAQY\nxp0W3WaQpsZ+InvxvJJJn//YnndM86Cxmvm8PlF/mK083NEuM3bMwq5JeNBC\nJfA/CM5yte/H31OxQYGDgMd+TJSCgll1A52bR/Iymi5a+J9lJBkZb+zmxRCJ\nxPmen+K0K1p5eteOoZ4HOr2azDTflZGDa5qpWvYySG1FuB+uP+u5bsXZK2sp\neRhIjJa/jgd8qf/2NnupgBkeYqUmfW43MN1jM/Sw8DZfx4NCBrQHLnBesVjF\nVYory59oOPUt1HkGUPNqLKBZ/n5TtGHYNeus3gtD8nMPChzVhtHDYFxaIEuF\nCoFEFVayK860zyYU8fIlDzNJEMJAnGYcbFpJmdm/GZWQI4gVYnMI18YbJ46Z\nLVrQ92Y2WRoboWO6jI1S4Og0pik/Kr2yNW/w2//Ewv8Xo0rzD4x2aN7yJfNm\nvWQyzu5/IXh6/6bkwRxsXSSkTpL5hZN8tMQFPhc6bXef0hA7DBXs/waTAUg0\naYFiJ+hY5MCXNei6l98p3mKAYDU9hIwW4QxJoqEa8JLmDEKVKN+c5UvqPd8y\nndyh+eHLUonvzIEDgIDNeEpWxzizRUgn85kP14YgwaQZJH7/QNdDW28fccXz\nYWQSCUJyfeB7AwMuvWTdk90a8eHpbcVNYZCdTZiWzawvz+0XnscTy5UTR3Sm\nEZQB\r\n=Fh7O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDltxldLVqv6hVM9ugkdSI8ZYnl9ONQE/N42zm/0xwVwwIgJp4Y4c0M/2XHMidG87XG/43AKu50foQpv3pNDZTLyGc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.9-master.20190613163449_1560443833819_0.8554044040741164"},"_hasShrinkwrap":false},"0.1.9-master.20190613165012":{"name":"@atomist/org-visualizer","version":"0.1.9-master.20190613165012","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a471362479b418350f63cb854ce1ac84c1580056","_id":"@atomist/org-visualizer@0.1.9-master.20190613165012","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-g93yWqJApAnsUtju7YLw7JN8UXhFpbtDrLOnkWdIFuYgE0S2s5NVzfXeFLr9Pn7Bl20IqLzQwmSUgIRg8Wa8RQ==","shasum":"9be68a10c1357920b9bbc0ca4aba6ecc483cb0fe","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.9-master.20190613165012.tgz","fileCount":153,"unpackedSize":870849,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAn9QCRA9TVsSAnZWagAAKN0P+wd1TQY4Xa/ge00RRwfu\nekttqSK4MuDSAf7Z5j3+T5lh0J8tVwHK1eLd6kwiijgkKDhyAfGAMhUXb2Fs\nJDC4o4gGvicDWWOAtNv8OOzoXoM2CeobHOTWXcolNlqHN/vaKsDm3251FYGW\nc/cPvJXSK1skdNxqRs9bpHk6AaWj5SpsaRKs/AHW65Kk0z0BjPDg45dgU2eK\n38+tkytdprYU20qoHEIqLwrkOnBveixnL6zuyYU8nDmGQQdt7VKnNwT8NzTO\nhBE5eR6UON8KXWy9/Ml+SXoawbZzOexBlELJRf29FYqoB5WJc8xY1LGVOkrV\npdVBapE3StVPuKFWUkottCaUlg1+WuM2qkIFhalYZzFbLQ8svmtUOOUlrE4w\nhCnQxX+nfwgDyu1KrucL/Dh9vBx68iU4+3gRWxG3WfbDuq7w95QUdvrtNt1g\nv5TqoCX68ylXcFIDIeVltRm6Ejp33623wuIAzj/6BH9tf6eMPY0B5ebbp9a1\nS2UwB0+bzqMve65Irg1FNEW3vTiMaTGk8XnxO+f1tZfgPPfEPyBb/NDVRUh/\nWeEM2/jXSj6E8qz3LNXVzDHOj0yuEom4mIGEsg7HeJwjhpTzEBj5AqSch7Tx\niwgikDmGeCSIwQPpMEkbDae+XGOA2dAj/2eLRS1SMztpErOi3HJMNPauF1GB\ncH8R\r\n=BTnE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDoxeTNR7wlCJgtsjaYbiO2YGn89jv6Rs7x/EOft+H3xAIgR6hU+gLVRgX4C1R/2jqdDvFZ9BBeXcpg/9rjkPCGCvc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.9-master.20190613165012_1560444751733_0.5572576133890554"},"_hasShrinkwrap":false},"0.1.9-master.20190613170148":{"name":"@atomist/org-visualizer","version":"0.1.9-master.20190613170148","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"137ea19c44a404b696cb8632d734eb9f76fb124c","_id":"@atomist/org-visualizer@0.1.9-master.20190613170148","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-wSYs1Yv+xRc8wd56syTevdX4QP891iE7aag3S73TjKSR8vO5rk53ZgZvy6xSdfg0l/UeHdZLt+6NM1YRKCmKmg==","shasum":"d8ae9558bae70873a6776b071f649eb73ff2bb00","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.9-master.20190613170148.tgz","fileCount":153,"unpackedSize":871219,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAoICCRA9TVsSAnZWagAAkYIQAJsIVL4F+6Xtbc7NzTeC\nAl1z398SQ3OXQ7tajkxzgnVToPK1dnH0565qotAaxFZzENoGoJgkaLFEIWo9\nkCIO+2v5sLolNevv+EnPplhbOlUjpBSdqlmlFx1JMrYEv8WOPegZXs+wSGNe\niQDClHoTAsScoS8KmVlI3d8VafTk0Prp9JA2DeqEJbZabIENbnEXzEJO6B2M\nBtPP0iFt4bKd/NUNXLN1xWglECASjXkdK4QB2QUWVasqJyajs44+fd6OTZJB\nJAMSGj7iglKF5CnwXYwijSoI4imARGNTUiV2HKl4/84//3d8gQyr0KV/8kIl\n4vT/7A+2l5HKwrZlRK8iNyMBW0ImSToMYkWFx/mYH8rP/sutFxZ6CZwTr7K4\noVqUG7N1Vhpcoaup+gaHKtmplA8TllUkfM2RQ51FS3j+4KQw36i+n+yiE8GI\nQIwHjAJbvStebN1+kMSlhfBdjbm2KdgPRgootM8NdPWGfNUUAs2itG7K/ZkT\nMaiarkWxGboiEd3Jd6VoPMlUPfdkuW0Rp4RkGwh2mvb60el6M4KzpsVLj5na\nl4x+RS0aMvva7EdUqYWiDAp6xy7i/Jwj7+w2x95KWkzxPxZGFr0tSjOdlOMU\nrdafsv6cZ283N9HgtVPTvlgL3NmeVA83Tt6UG34SdjnRFxNB/ixadJjHZAzC\n1AmB\r\n=vOVT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDtbB1Rv1jyq9P+pvqUzGUpMWYPNv/qLb1YjjyCXnNRlAiEAu2SXhmMB6wts+RyfeMARIcSQmu33j0TuG4dPp9iQhaE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.9-master.20190613170148_1560445441617_0.7912348737536112"},"_hasShrinkwrap":false},"0.1.9-master.20190613170952":{"name":"@atomist/org-visualizer","version":"0.1.9-master.20190613170952","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3aed5a3937a47b511675aa1730694a2e94a3097a","_id":"@atomist/org-visualizer@0.1.9-master.20190613170952","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-gIKSSyU8Wuh4ETanAdEus7hBGwJZKUV0Az+n8D8cCRstmEeth0YZ8DAJOeCDrG8nMyHwlbDC+o4yHz1UPr955g==","shasum":"a764e7418d514afdaea54de260928d321825fb27","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.9-master.20190613170952.tgz","fileCount":153,"unpackedSize":871217,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAoPtCRA9TVsSAnZWagAAH4sP/1ovPboIOIP+IeAPNafC\nmPLXK63qUM0mArkldks5IVUM1wyJbjPJbZFZk0UfaXsCucXa11wvZc40lYb8\nz37JcCXEa+A7OFyG1a9FLFjb+swz+NsHDD7XcfMPaIJj2VcWguLGfIT2bBn9\n4KxNYeE7Q9RprDBtwYKI75CgaZgPWCuXLfyzIkugVldSdwuEyGDUGzbOmXK+\nSvIKEZNIt9KEfHesaZ9mw2qoMoufE1IeqUUmzxpQAQBzhx49doKCt+4AlGf7\nOlB16dbFWtn3HwiX6nAUjapsI63/JWh3GrkzwBzpVe/amlyQCRGaLIe+Vlxc\nrngSPEK+/mQT5WlrPg7zT9cbrk8U6/Nqkre0T2zqTz9gxiFGEkKIG0D2uls4\nlCsFcrEXmRUMc1Q+fBJTZyHq6xK2TTWrRBK617vazk3yix1PEIocPLuhL0Yx\n55fvDsKtAvfGjemkO3uzJvEMxHQ0Xnu5kPdoOyUDayDUwtzshb6ipZhAk8rm\nk+LRJ64EDzzjR824tgftKI7KhULF3yLMSIw83MYvjGHQhxtGeOczr3nueQHf\nIDpXaA4VFYyACEwXD+FJeumpbWod+ezRZ4eM2/j6Lu1stcNpcbz5IfEUWLbZ\nMqFBInaOWFMGcy+33LLyn/vbgb7fWcRuCJDOmmr9gAcctkVG5Kjny75HGxD2\n7Nrd\r\n=3EnA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF2acvW7ssUUtdaiIBQmrDSxJMmLSUTLbJjujF7YuY6BAiBvDhYI8twQEYlajQVVigQodVfLI388JNcuQtunLTU2nw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.9-master.20190613170952_1560445932869_0.002722137894013432"},"_hasShrinkwrap":false},"0.1.9":{"name":"@atomist/org-visualizer","version":"0.1.9","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"98a1fc8d9724c64be1dc7a6544250c92c1723a9e","_id":"@atomist/org-visualizer@0.1.9","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-UprGt+mxjC4Ue5yN6Idkh9WVhSSDF4vq4oLOq2KIX6Ym7SuATytflQ2fNzOZaasspPHFy3v5Vo7BkHpmfwsB2A==","shasum":"14d0803cac0802cd45171cea1b90ba638fd4ccaa","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.9.tgz","fileCount":153,"unpackedSize":871195,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAoS3CRA9TVsSAnZWagAAA8UP/RWJ8xtFFQSdcupOj0sE\nGn16/TBooMRLvlQsQ0oQbz3NteHmcTpvTECzzg3nHFMI/6yuxTit34FJpF0b\nCJMYaFhPZ+CA9QdNlsGabalSZX2KnbE7NcXAPMOauHhvLSQoBVW1kgYZYDi+\nManVOCbp7FbIdYWPEVo3RlqVFbNsTiTC82+PtcUDbDSITeSTQmE+ycR1j8r7\nq8ueaIaU8tCjwxdZPQUWnGtf8nEie7670/uE9k+MkBUpclsI9C98ijVv/ILJ\n3vB1BGCTyEFkTdOXZXIzeG3EnJeWb1D8+fkLUJPoZMxN8AoobZVo8NQ00kzJ\nVfM4noiM7vrw030drECQ2S9rc1W/LLhYCxbL3jzSJ58uYu9Ezr6PWfZ+vzRp\nvO4d+3bAM+WrG3q6uE3bkAEVJ5GWH6SrsIR13T1eGF4O93btvfNx0Xkk7rCQ\nspuB/o5IG+4rl5znLwU3gMK9K3hOyBiyrejfDA/jHhQpPPBIrRDZjPtCYL55\n5GHRSeGLS3fltE/EH7Gf5ghq6Au5Pi6wJ107ro0EHT0XooBvILycUn6UHv2f\nCLjbi6JHA16jb/wBuOvy+pshY7cv1w2otxjXQofTfsp6NJ9NzDxFRldFRmgh\n4lKztU8JxRM9qCKlAqON7tos6hAuHOTlhAicGHWxAJgUwxgOnT4g8Sw6VJTS\nKxuA\r\n=gEOV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDKEniN/hSS85/AMcEaU6l/GFjHYAFIvZyLADLXuWWRqAiA3mefi6zcXLYbeUOOGkteI4CHwpd5mJWJdzdcdOJ2ayQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.9_1560446134456_0.8684333425250197"},"_hasShrinkwrap":false},"0.1.10-master.20190614002117":{"name":"@atomist/org-visualizer","version":"0.1.10-master.20190614002117","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"12890e08684a2135019a7cfce4f3eaa53f9552e8","_id":"@atomist/org-visualizer@0.1.10-master.20190614002117","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-bAnwSK3tHnFsG3iOSUv9zop94LQUcix6saCsZiZgjl1UZaniexqBXAOZK8OCwUrYmU9p6i7U/HzaV+JlN++ymw==","shasum":"3faad9a2e9f1217e0755749076f49c07e569a412","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.10-master.20190614002117.tgz","fileCount":153,"unpackedSize":872457,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAuj5CRA9TVsSAnZWagAAW58P/A2lG0vfp+A9fG3NnRMK\nUnFIGKNSSRyS3p6U9o0kBsV9imqVqtBC8m5K4/CoOrn7D9yZPsBSixV8uCIC\njaCBIjOlfLxVhdrvDFnGEcfCj5xznPvixx7uTebEFbg2OZ3kRmGrfx9khMjt\noW9Pr0eTcSYqOWilKRQCQelW8UdOlS63pP3DOeHMP5qugG3XyOW0k54RgSws\nz6Keg8dW3AJmKJz4ewL1bSYa/eKQ9NzMQoljJsTRJze+vQYI20xXFWc4PGI8\nu421lsyUxsqXSthbeSnUY16AYN1qgjS4Z40HrfOuOiRrOwMUa78oJkATlj0M\n/5/s4+akmTVPxl6GPFyBaytVKccxS+99hWB8MNz/vQ24g+bGVM9zKoLp7LLb\nqKUFKQh8DW4BcF2jhGWICnT+DcWGZQTguJxBDjQ+uboSEfDMaXCXM23YYP1S\nkfJDoO1sl+EIuNmQkGMDg0SIjbY7YLkX2rEelAZYQm8TwL772s70S68dVjS8\nuGQm9to6kE7mCEuccRGJpo8T9fwBGHL/tcPGEI+Yl8rk/Be6/xZ95Fige2gV\nETVRCCrB09NSa1z1ltTW4mvP6+6MO1CNzHnY4DeiWt8UBufAKLfnVf+mW42f\nXzuOLlLM+ALSApV2DaYLAsGk8tRPeuj3icrXbQPgi2FYMCTmgPUbHnfpAdp8\n3gKj\r\n=flq/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDSW6XLRyDO4UsV4yUjneOR7ZVegXJGM+B+ep2skZ7FsAiB63ayV8GQ2hsRJ4W9gzxRlcXM50lvPZfcSsKx4IiMOuA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.10-master.20190614002117_1560471800531_0.0037317903186731005"},"_hasShrinkwrap":false},"0.1.10-master.20190614015128":{"name":"@atomist/org-visualizer","version":"0.1.10-master.20190614015128","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e3bddef6c450c1528970696d04d0988e9f0bd059","_id":"@atomist/org-visualizer@0.1.10-master.20190614015128","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-MgnGUcZvFD+wrg3sw5Sh+d5jsBdr8idNBEzVUn7t7kiAupdKnmx8A90FpXR3fLdS8SpwYKR8dccTstjeM2hjxA==","shasum":"748f0fc4c08ca534a4cca852d9599d5c06cb21e3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.10-master.20190614015128.tgz","fileCount":153,"unpackedSize":872674,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAv4ZCRA9TVsSAnZWagAAT0oP/2Yrzy4ZCm2Bx0JWc6jA\nkShKSMz0XZVDRl5jPdbgJ7rSeolS76MluYdA82nUjsG6q6Mtvv8gk3FRg+Op\nqgbW4DhpGE0XmFimt/n0HCu8uEJyaZBpexKNGowEUxVPh6XZoBNvDqMfsO6O\ntANtR1wOKA/AOfmraA/Kz6NaMNaUSbloy5vFIoRF3fZ0xVAC/b2DuOSB0D7B\n2NRn3GDZsuoWEktG07eDoLH+JclTgIbhjABLM4TytQ+mxOVALHRncbNw0H51\n9nqjOCW7a/d8qF7T8wx5fru4/LzsXORWiFcezZbabHlS9cMjzgf7sfJMolU1\nhRWsk5lHPSaY0b6uQOt9ty40Ut5m/FVQyzRNKmtWttvChrm92GQFl6mpjfKV\nddjOzndPc50WkRCz5rGgrzCUHHOJNcw7E2qGn0NUWX4aRIU1u1R1L2gVx+8m\nxJZh1T3/zrZp90ppgJLaoAdxe/fRlQQNWpkYRWun0yhC7oJY8P6ZfoEPaqsg\nZ3a3h0JV1UbtQHg4vXxcgHUsfnKoX+rFglxnJr/5LK/d/z4IgjP4SYzRcDmH\nwgyxwRVaF/X5Fbs+t/TXnsAf+RFNsDDkB/rzyuN9x2GB5mJhACNjN66hDGoi\neeGXPl5VHdJ/FqwzAQIqmcwatWE8/ubZTK5JEfX3VLGru6LPPO4UvPlc0f2m\nWBLU\r\n=jAXY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCZ0H1orJP+9XXTGC73cEfSBP4JDMFAOCzxRrXEAHMsDAIgPDMqPlyiHjCrH/Q+P/SOddVnVPTJ3OBav0qMaKRmGHc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.10-master.20190614015128_1560477209152_0.48034549851342145"},"_hasShrinkwrap":false},"0.1.10-master.20190614022830":{"name":"@atomist/org-visualizer","version":"0.1.10-master.20190614022830","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"12945fd2b7146f10827b649f147123fd3bb74067","_id":"@atomist/org-visualizer@0.1.10-master.20190614022830","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-C6bMXonYkeRYjA8gPK0mfbFIfgr/ZaRpFXBNPTXyVMWTzbRRSOx0KZy3hYrxgVvJAQE6qoc3/HBSrNJJAfb2dg==","shasum":"b1bbb698855b66b8e3d106249cc9b284b75d6f8e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.10-master.20190614022830.tgz","fileCount":153,"unpackedSize":873411,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAwa2CRA9TVsSAnZWagAAZ5AQAJkkBCozCn/jFZ07+0i3\nkQW6odyMVFcMJcQnEkQ9TQNRxVO7heoOxqkEmWexAAPV3IwgU7FZnZMfrS79\nT3ttoWx/4/O57LhOIfCmQBumMsEixBkOHXpgGZGCOjJyf/5qHhKIl2s2/yxh\nT9Q6ET+f9zuppzie3lcUvE4xr/FEnUq3PwJyrsC6zVfOXdhI9KTa3mXTuQaT\nSk9WIsZXqTrBcHgSFE2bCqQ6VDyCT9H9B9dJigK/vCykYOaNrDXWbmKYoL5s\nQFYATL/QkcFy+kRZFBjzO7n/T0xSG17Yn8pF9OcoXy2a0yVV9oxzfpzlJ1sD\nigXHmAfnrmhSZ2MNI2jkrfnuo/OMQSi/EjbiudgOZC7Nzr7ur8ufLWhZ5tNh\nkeIDzEzQSr1jLgE0lsDtE8yvdZtIh+trn4t3/mu64GKX1w8H4bCUk15Hn/WW\nPDHset/7IrGTOrPIMvCa3CXYj/7guENYBE/AGvulbC9KgLdFUkob/d6vYpJ0\nMz0+yOJ4gwrGL8EeaHk4XD4t5dYKXeeu6eh9VQ535hCNQ0zlLoOKPn3DBHfn\nbytR0kThKmwM+6RH5OV0Hq+PST4C42C2k07VhOOPMqFwKsgvyDk5YTkFP4id\nyVoJDJuYOFyWatP0Dj4Op8UGb2Xm0vKqfYps8cTlfW89STaVU+kHhcXb/dBD\nR1T3\r\n=IXbm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCn0BZo+V8KY0GMTvhmJjSauT9E76Y8E+GxbBjINmbDZgIgB5Gnv9SlC1aePGvjJwUNaM10McJTlEywU/lTvx2TTuM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.10-master.20190614022830_1560479413491_0.08458963629557559"},"_hasShrinkwrap":false},"0.1.10-master.20190615071148":{"name":"@atomist/org-visualizer","version":"0.1.10-master.20190615071148","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1abd4a8c8ffbf7f91aace58ce281e6bf9c67db4f","_id":"@atomist/org-visualizer@0.1.10-master.20190615071148","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-PI1HEyhceVTQEDjL1PHjDMcusYX9acGXVnVhSuRAAFghEAHQ6hpxWKtlv78TciqJCO+t07nv6uoc+shiWpaDCg==","shasum":"be0bc09e2eadf3201e8cb786eb44c4de65963e18","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.10-master.20190615071148.tgz","fileCount":153,"unpackedSize":874722,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdBJqwCRA9TVsSAnZWagAACVoQAIuqoPaPUPaE/EM0WcvY\nDWpQkOaTA1Q9jURymDoOT7KgRh75SzFHyH2kRssjxMyt6bc0grJ5ctd0N2jJ\nz0aQ7QPMfBNvkysvzfuN5PWMpLYqprYanS4AN8uOaVPg8k7MzWnMYChV9MCe\nDpD4/LX5mSqbio1tmQOTrZzgREwJZYLrUDXZk0Y2sDvEBjaY8LHQ/0q+TsKV\nJxm71msrV6fQnYV/bitHBwPPYlBBiOPgpfOrqpop3q8U6RKyg/sdotA7jQN8\n59yicYlNPM1hgzfgqxIvChnuI4PzfwwhW/O4PaskhAZ+89XbNvHY4k2csQub\nvnDr+vJsywvXfGlVA4Xk+w464WwcCNgfQwEuzhcfIqeqUrs8b5Qya8bvl8Hq\nDEyQXJiYpoBT0152iqjD9Zgs/ASiKuRANvnYpRz66WpXOLkHA9q7kdC79fAA\nBTYO6PB1vSkXYGb4W4LIOVbkUFgmBXXW2kbLH+cQZYYpE3hkexE6MGsh+V8N\nmCwnNeZZ9QUSiYiSOTm+fyqj8pxaR6fUb0CxtF3b6I8RDhCirToYWkiYXXjR\nE498utT9W/jkntc1DZ/9mJjfW81Zgx1oE2sZs0j8pm/fuSVo4AZgYh3RcmqS\nLr56exD0nRgHHBTv6bPvu1fXHa9gO1UfK9Q6QIVX1ql8KZwXVeAQWAVcGlmL\nPpJK\r\n=8SxV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDy4Fy0Am6ad4/NK8eG2kRvvkv2Geb2oTU8hKKuNKS8JAIgGvC1YHdePjRSC8cJmDDu4YsnOYndwpTeO3cEkbi5uBU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.10-master.20190615071148_1560582831398_0.13398022808833154"},"_hasShrinkwrap":false},"0.1.10-master.20190616084029":{"name":"@atomist/org-visualizer","version":"0.1.10-master.20190616084029","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"01114731b82950026a96d7a5eb8c3e8d2064b43a","_id":"@atomist/org-visualizer@0.1.10-master.20190616084029","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-w0BXnSgjZJLOIpCB2qPmjkCwXndgZBHpfypXsuDNBGMgWtTAqe11gIMmtA82TK/1RP8nvP7356h7ymYArZEPLw==","shasum":"dfab53feb9453eee10ef740d428d226b2e86f060","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.10-master.20190616084029.tgz","fileCount":153,"unpackedSize":874686,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdBgD4CRA9TVsSAnZWagAACrMP/ivUJhNY1uYfSf7H8Mcj\nWYGPFMtExiUu4of/JAhhyrlPLqVd7df0unAaHOSuYclGU5P4USLPdA4tkUb3\nH4qpBDRdt1LIIoBzSdVE8bpsdaZhdXWYzV2RoLtXCXQ4jJvAiuVkmDaE/kNm\nkqnc14pAaINtw4PumGbiDYA8N8+WAPQVy+Ib6GB5MGk45+qWuF2aDZr4bELZ\nkRydxns/BQGo43+0P9G9qtGE4XilqKRor0uQh3beIWcOdPsEaLzI6D/5SURv\n3BAr4ljoOSim+CiqksRjTwwz9HmttHMXkMu6uBi/TgqgtOCnWydyBruYKDS8\nQjK7xQg1Vz95PKI+qVHA71ZNuJo0uL0D6BAZsa9WlNrmVSk4FDokq1uTli7F\nPd8AiE3BEivXinoVDWnfb6tQK4cPq4QNVbkjkJEdt6RwP2ZcN6wuZMvbWn+9\njbN87SIZspU4vD+/lR3I0nxsIeVloCyRGM7+V1EFfCVEr8aIoiXGkORapwyQ\nA7ibaPk2iVQodjIhF/gcaz5Fh5aJTyxxtW2p1vBa6EaYu6A6nB7m94iPjGKE\n/Q25j0qRw6vRrMaCso+mJeuEKumFC3fQUkLApjGKz/gXUT3chfqMyAKVRpA5\nnzu/ES6F1GHIMTBKV3Vk0hemUM4HxAD+GiSo/ILWFnJA3RAfvcZ7VRxqd5Vj\n00hT\r\n=dbzC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAM/I5hdrPlPS2pOu6BZoZa6SYa1V8vx95WdxHemhPX1AiB1ZqFxrvUi42jhxMhyzjuzAKQY6AgqpiMJEPRJGmhjUg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.10-master.20190616084029_1560674551644_0.20613999714721243"},"_hasShrinkwrap":false},"0.1.10-master.20190617163157":{"name":"@atomist/org-visualizer","version":"0.1.10-master.20190617163157","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8b23d88739e01d28d7d9776b769e49deeb892252","_id":"@atomist/org-visualizer@0.1.10-master.20190617163157","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-GlFFt/CV7ktZr3QSHeiHqKI0DU2K0RnAK0nmz+9oHBH3b09bzvccGTFxQJTlhP3JWbJdA+DQQ3gbvtBsZdHMZg==","shasum":"0cc6ef1301cc4fed249b5be8675d8e4a3e148de5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.10-master.20190617163157.tgz","fileCount":153,"unpackedSize":875199,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdB8EpCRA9TVsSAnZWagAAFigP/3FC5WtovoWMbf0dkDxn\nrpyhPBBwsjjaFgV3Z/Gki69DFNcEgJPrdavRQBas9DuKwRkAQ7YcqAX/Zw2u\nANV/3Dztz/nupinK0rwwopxWmtYx2q7Cv+exEsvApZFhg0tTLlFZRaMkfhwv\nUnej8A1SqaE8qHe13cTI3vn/NauyH/d4qP0aWTEvr3gE6vjsQt0UTLtfoZ/C\niSf2wqtmcoUC9e2NnvMCnajHX5N+Ux5f6yGbsy61DPP02J7E1hN88in44WmZ\nUqYVwHZN8qawa+0Udd6cYt9eZrGA8nTkayFjZijBijf/gs4eY4w5VtSxevcD\nW9TIoFPM/0N262uZuU2+jM1YkZzF1fJPY7WyhefgQRqy/mwx/U0Yg3Wpi5mO\nmIYCkyGvgUBq1vE3gnzyBtVv8qujK5yB8s3Vy7hmkh3J8ARdjdCl1Zpu43VC\nOwljrP5z/fhTSq32Qj7KWhdcBkw4abfRJL339nW+s+sWXuzo2ObRSe6fSQiP\necMbBoPjJ8UjFA8k4Q3vgTBthPmFROfTBRsG5c8BrgdsevYRYPsrxxqgyjsy\n7kgUqjUAVKOaDR+hGPBITJmEEiXr4yhq/tij6tEcgzpv/pCFbomL3hVA9kkH\ncmwXKlIuxCqMBHmKy5ksxqLz/EL/T3B0g+Ks7gEv5w801kZhMNUk/tG0kYtw\nnNYV\r\n=o+FR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCjQYoVjQxmpwssd/yZYYo/UVyzvPZTz2Bc/RtZLWZkCAIgI3+cr+9mLKO+I9EORYKK/UIsgR+GwDsOkXfivXZUrhY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.10-master.20190617163157_1560789288754_0.11374663443697353"},"_hasShrinkwrap":false},"0.1.10-master.20190617191632":{"name":"@atomist/org-visualizer","version":"0.1.10-master.20190617191632","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"94660fd55ea26a9772a6c8ed8547bab10e024c35","_id":"@atomist/org-visualizer@0.1.10-master.20190617191632","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-7bbWLgasW7zDAGbatkoULLjkG9+m1T6q0Znp/xFrnvM2N8suLl5GdhcPBNmrb41dYZ+F1PHy2g/KD6rCjZIpnA==","shasum":"dc5cd5443bb85ee62b16996a72be85007751a71f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.10-master.20190617191632.tgz","fileCount":153,"unpackedSize":875083,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdB+euCRA9TVsSAnZWagAAL9wP/i1u33cMtabnf8cfldMI\nC24pxSRJQw9L8fZb5f57bpfpAWYiFfvdm7HKnirY5qiGBs3BQn9XrQCIJZJy\nDWAxj2sc+eE4+Abr07tHnbLp07I9yCnJUjS41gOHr+XKbbNhII6b2q/5hN3e\n8d8SraddFRWawKtfomvsswNkyJIwYE3UkXjW7sJCp3WTWEOu24ME+JOsHGRV\nzWpyDXtqWVuX46eRNixuCqSx0bKQGmVD13/yRLi7BfWL/N0jBjOXYxOpJWlB\nbxn9ccrdcNgletF3UQGxvniVet4z8TnMKyHgSnciLMeU/KVFqxG6yWy9yI4D\n6nLneSkNGA9+Hnv7uhMxqO3eCR8zNETmKHqZfUXHAQztO//bVR7f2ocl+8m2\nRQC9oLfrsMZDBBD4ICoxOKvVD2ynEWJeM9BttWM61uQD316RYUO7rOLefO7P\n1Nr5M+PX7F7CIEmZl+Boi0XBAR/ZTqQCs3mVMROOtXjU8pYq+BeeVXzsEQBV\n9koJBEUbD6b9Og7x1PKp5VefKtyi4k6aMIJXh99Xbb1tYMrV3cV0saMc8evv\nq0XH6dARvC8l4x0eGqWQS5zAlrEUrxaKRuBIlxHSDn/PDjImCYNhTbgj4jAn\nfipulOzNap0cIXTlBzZ/oEgOJivChjuWNkrMk5Z+Il57WpWarIpEhX+Anx3S\nSQyx\r\n=LrUg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCbVsUPVZpfb1OAgj5yDjASG+FPQfUdYRpzGFpA7dpYXQIgOm4n5Aa/mvSRsQXABtvyrqzDbEvAg9m5/vXy6D4efqY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.10-master.20190617191632_1560799149791_0.7697832606292816"},"_hasShrinkwrap":false},"0.1.10-master.20190617195826":{"name":"@atomist/org-visualizer","version":"0.1.10-master.20190617195826","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e1c4f225d02591438410a8bd22bf995bfe90b6a8","_id":"@atomist/org-visualizer@0.1.10-master.20190617195826","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-vi/dYS2eZ35eEmOSuwPqw2QciS3SOH7kOizNUhBWi3fP4GhpnJrvCeg/oCCjLhTsz9YBjb4L3ns5fvVlw/VC+w==","shasum":"059098c1b831b9448de7fb9452f2584d3583c96e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.10-master.20190617195826.tgz","fileCount":156,"unpackedSize":881920,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdB/GTCRA9TVsSAnZWagAAseYP/igLX+iIeGWpmVZC04Vn\nnBQOTSNxzSpaXkVKj+TawApg4fS/vdAK9wii4MaxX8WNwhQRBTXN0ymZsqof\nGobL22BW7FklPObdsKYK233F8nyrs0Pjfwu0b2jpDZbk4j9Gq/0Wy/sKP5cF\nox8ZRpZUfZq246utRRrzUMTziP6GOANIygZvwWYnZqDl+I2e/o0q7O8Kq8oa\nA/BDzfH1wufBX9ub5uaRPawKeNgKEJtQNmySWcQBAm4Pu/nFVN5AFe96KUNI\n0UwDIGd/WpzMVkIbcSUUDZ1W+cQKVQRgE+u7AfsYsxLdwOwpFAwy17QAYYhc\nurc5Eer3iFrDMJkkgwp9UmY+0UaQYZUjmhkUzs29wAhuFQi0tcrCS+kfx7no\nJlubRouvHV5pBqTdzo1rRQuXEeGYFwseJ07Xwl6mxcdGQC7WAgmD9FQ/DuOZ\ntF9nQURmqt1qAuq4XfBdFsGwms6cMdPwRFuX77oAAca6629fzOzpHVaRSPl8\nmunEqy2aDayvRsUi+UzM7214Z1vRTTghLQxSfqOozdHa+To0JfYZyzF3XwPW\n7PhXTeP6elh6s2C8FgaIHjc5s0ctc30LLHcPWpTwwHolQdp5v8EdOmMfxcEf\nindkeNf4GeN4hPw2lVGg2scGmUowZkh53V5wdJBO/bnrvfUqISSEr3hnV/+z\nQj5U\r\n=Z32a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIASp3OGTLxBKCxCXiKlQYN0NF1fxLkhaM1QE/M4hIxQiAiEAxkQPrn1xGDve9+7fNBEsnCmSMS6yH0nqjy50aXWITUc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.10-master.20190617195826_1560801682879_0.2721687807663564"},"_hasShrinkwrap":false},"0.1.10-master.20190617203105":{"name":"@atomist/org-visualizer","version":"0.1.10-master.20190617203105","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"25e4a949eb02a47d5a901d6ffbbb392ef8318479","_id":"@atomist/org-visualizer@0.1.10-master.20190617203105","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Iga8GTL1Vi2i/dfqyH/uDjbINbUXjy2nVxAFcCAhFyPcM9sFL3zFm4ziUAJhFF4+BG+6man3UhMSQCwYTTmUUA==","shasum":"741a87002254377b084c163ec3174bd3f27b033c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.10-master.20190617203105.tgz","fileCount":156,"unpackedSize":881966,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdB/j2CRA9TVsSAnZWagAAx8MQAKN0yqV/+zrV03/Ru0EK\nYFerEEzFaVOB+RNd33+50p7/5nSHc8vsqUGIYQAEvLKFkhdW7cMM2bFCfX2O\nb2hG+AOmPMwAMdKHh42oCdc08P8iVLBlG5lrh/VSoTZO2oGXjqO8bHOB+Fml\nLNVgCEaAtQAuJSqCiP2kQFvQHAhlk15Ast2tgai4k6PGouexjHBYW5fdkYU9\n0c7w0tw6ojIafsHf+cX/gbK8WNB6o7YbuAbCcjmWsikmCsMtT9S0GBgmf2K3\ndhl5JV5tPApU99RYqh5O/pTPXnuF8oJ9WEnVsvhuL3qRxx0aMgxap4Ex/CBe\nvDJ0lQWee5wBJbE8ggA8Rz2RUcBHCcXVq0K4r5HEgI3qX9prbJaXxNC+W8hU\n3kyE6DFtCegxq1vr6FVk7nSb0VZzia2Di7pOBTY/S6Xl7jxcHrbufop11/uW\n9bLcEA0dFyVYgUudToizav1lFVgsi/THLNcHiXNjqQGfCE9bODGggiZmOuhh\nE5k0OIVy553EDaboxNlkjL7VMcfq2QcD5ZLWVyuyjTt0rKFqtYZ9B3b5YhGl\n4bBn9cOwAbhIvkP75QDNzM0DjdyI4ThU/DFQ4h3DvdgOngoamDe1p8oV0tSA\nLWhB5WE0q/bzVLykhZg8vlkygcZoLq7uW9/Y2WQsDjEddlD+yN026Qb+zKnv\n05rM\r\n=FDJx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCpJ15rHRNKhaP1MwSMf44aVDL3bJcoednfvt0jzEmslgIhAJXt6iUfrwGNY8tdmdQt1z+BGB5C/5Hyd00+yim8M0bu"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.10-master.20190617203105_1560803573752_0.9015162828846446"},"_hasShrinkwrap":false},"0.1.10":{"name":"@atomist/org-visualizer","version":"0.1.10","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-master.20190613145127","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"55c5864a0023451a7e12e602603ffa022ae2fab3","_id":"@atomist/org-visualizer@0.1.10","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-pLGLWONr73CP6KlJOlbxmLSSCXpom7wPZq1q/PXpGJs+P/FqlFZzCAERKd79txO9dkfqwfA5pLXh5m6NrDz34A==","shasum":"d85e48e476b582a582269d52ed160c5d68934ed3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.10.tgz","fileCount":153,"unpackedSize":874664,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdB/z5CRA9TVsSAnZWagAAIFQP+gNOVRInAgmwzxYlU1Xq\nYUBpDGwajMdViRbaUMcqlPXX15FZKAQ/zjjNqqqMsqqw8BTc0VGz1X26soCG\n61eqcWi3yBZLzjWpuSNsKOtKHi4JlRBV5rFoOiiyJHiHngeUCcnoeTuBIYRd\nYf/JgYma5ON0yU5303v4NdHqzSZBb9ZIZIT8kssaZ0KzlBkPul0w+lyDjurz\nCROOtcgl9S1Nd1ywQoefMkZdakFqAdf+4EvXZi8+Fm3gKBje+o1vgm1Gn48B\nZP4kvZ2+05T8CRq4L5I3crqQ2XkCfvSsHQdYLTZeoYGLL+ZdfJEekS01TtIl\nlF60ZR4pS+/hwSTiB3vfoeaHBiGFHjpquxIWIXS2FPR8+TdqZHfWSy4R+ryA\njePy0cJs3+CP0UrIhqmRZtmrQTM5ul6IrArEMMaA3Eg6rDigUzoHVzyN3hBv\npfrly9U2u0o2K4ikGdkDsCPllHUabfJde47SGx3MNbVeYCCvMwvfuADM8lCn\nD+tjlWawn7NOBCJnGefbDzBhBtNR3H6CHphy3Ee+zmhEokSi594uLpm6rsyK\nctd1pc+m8/id7May/0T61lXGdsjifTpyoG36mI5FV4ZuEY54xXZfrn7WASnN\ni9xuu47duFYysumc4UENXd/pgTKHFxI9xdErcd+PhTamCoW5AiEcUvqwkPGo\nbwrv\r\n=ayfm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDpq1+ZBP1trcfP137N4RE62d2oS1pUXRy7UslW70CzdAiEA4kPE9L7PJzivFP/m1u6hC0Kl2Crd6yTgsY5JFaPxKu8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.10_1560804601331_0.5075329366989894"},"_hasShrinkwrap":false},"0.1.11-master.20190620120844":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190620120844","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-job-support.20190619160730","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"91100bcee893c5d6ca9c89586b2cfc153c100850","_id":"@atomist/org-visualizer@0.1.11-master.20190620120844","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-TEH//9QUI+DgkyW95gtl5jpxzvcGhW54Qkt/ZUPaSs/glg9oXB5GczAfvb84LXP+/uWWKkvHIiDibWRWC+qPow==","shasum":"b0e3fcdee88b496cf381cb5daa9764620d43d696","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190620120844.tgz","fileCount":170,"unpackedSize":2582015,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdC3fKCRA9TVsSAnZWagAAa40P/jbHteIXnRWK7ollxeHw\nzhwBD2q6LoyTpJCGb9LRwhv5ZcDyfe5t2ooh4Rl1xfQ55KcHQy1UKaOohvR/\nF4CMirbyme7Ig4kGvc1yGHzbyN5vGHn1Y7j5njAJIuOmhetT0oIAVPjiylTz\nl2X1l5dhtHU4Ku+rDBjaoGHYuhtXf8mMiXgZhC97BlHkyaokj17PPwR1g3PX\n8lTHRxx6sVmWLZeYf+IplVxIvTpV254PK5jpd8hdJ6sx6+4wZPRGeoCAN9XH\nJsLdPw43+sY8naP0XJCdWkqiqSmqQ5xgQLpUDXBeIPyCMKnO2QgFPrCpVIWR\n1+PRNQCrYJHnO3JA38Q3p1XLF/TP3YJY+oVeSkfu9npHp1ghQCiZjvj7KQ5x\n5xqeMJGeE2bOUIWIjI5M7qCI48iiAmhw2oNB6DA9uj6w9bhwKJrZALFIGmYg\nmrscL99OxxV5/izACMNo7zOF45jwhSctByf4BDce90c5StINAA+OxNGYd7De\nuSBi9s17LfuXRXH9Roc6NL8W+BDoUb48bJk85lTmucN1U5Vja0jNkkEYn1cK\nGd4ugq1KBLCYD5PRZhmhlPKqC67QpYywn8ofkvoaqxbKM6jcz4CG14d4crwx\nKSTffk0FBrvIeKh1WbGrnRkrPzjaHEUxWtJ/unonqBNrcHHXimnKP45mhGaa\nHgxO\r\n=VrUe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDoQks5+Y/J1hCmK5ze/F5xiF4Ip8w5JulfoOhvd2nGpgIhAIIV86iDR/Co2GLCXZ4zF2ZToKDCptbvAuy5GET3uGOc"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190620120844_1561032650095_0.5175063149283032"},"_hasShrinkwrap":false},"0.1.11-master.20190620153201":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190620153201","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-job-support.20190620150522","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"85f5eaf50e39e8e59d7e1b4ea03a1e9636162a84","_id":"@atomist/org-visualizer@0.1.11-master.20190620153201","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-d5tLdv00pftVa/jg70CeNPW58CuIISwhoWUPSUfPPldYxI628vEFpyCYBYO1xXS/2Ag1cZhMEFlbZA6EEjiGyg==","shasum":"443eb43c1fb61540908b813746a14621c018a77a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190620153201.tgz","fileCount":170,"unpackedSize":2582287,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdC6eMCRA9TVsSAnZWagAABgEP/i0Joc9q+BlHzBeUMRMA\n0cEXNjVxpFVxcmKEp9+V2FHDrYX/s9xLaOilDbIP5MV18kBVlPloJEZWwv9S\nOs6EnSO47RsmhUOzvWKwDHYpLoUyBzURAKGYakOVTJL3N8yY5tkXVjL7RAFz\nl/bf+Vc5MjkTD2wLT0DCA+/jwj7fNPzTDnDkUyIo28HOh2GukjooZIde1U/g\n8n/lNbQbqjCOKcxx5gGkCpJg7YZKNGHZnEdEyhPI5J+RKJzuTwxght0Wlh+4\nmLBGXX7I6Vc6eTr7lmPxDaPsIvYgukSHdvJGBcHWGSaZDCwjqXV/xSBQhUkK\nEi62FSXLOkfSahLzm7GXSAjL3rXPD9EAoS4xXBe1cczeSRWztDet3RkIRp0f\n9ytLTJkSlr4p+HUL6J9+7gY6OM44jqHQkMDHSu4/oj/xzch5nvHJmdgVZ+zU\nQjgQbYba1FzDZS3H1yeb2YVlkE+AzemCSYz9qW/GgWdP7mY2cBRAu0uWAT8c\nMS4SmjsaSjgQV7cRPPRMlEaE7MhBwVPeo2NE1hz2Kw8PHZogKi1AlQl2KGbM\nv5qoj+nqtwMsjIEf00TWUj3LD4Q96/NVTld3Wazvhb52eiSzWYUoWpF4Q1AP\nNN3ozzeikADXnHTA1GTBuC79T2UX7qPm1XMw3bv1BrRe6kw9Otdobh/Fxhwm\n6U83\r\n=Uydz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHwQx6+fHqgfCuu5Y8rJLV0a0fj0zk65Aj5W6bR+1RPjAiEA2rMpSJgrElmsEUO8SaY0J8t1WI41ERqb8fXSBTNnbTw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190620153201_1561044875727_0.18541478183668758"},"_hasShrinkwrap":false},"0.1.11-master.20190620182744":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190620182744","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190606233707","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190612123215","@atomist/sdm-core":"1.5.3-job-support.20190620150522","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"^3.1.0-master.20190613085807","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"920b2c1c3486f086c1d8a7fd9637d24dd959a892","_id":"@atomist/org-visualizer@0.1.11-master.20190620182744","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-0ATog+TmWYIH/7BeNGPYvjrbVapmVG/DLWF+tDpHU0kbDAVPZwH960fr97DLMeeB+U1HtwXwvA5LIEcIsuh0PA==","shasum":"6d20aa0d2842e1e1e96f7f2b5b5c2ce656f1513f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190620182744.tgz","fileCount":170,"unpackedSize":2582287,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdC9DzCRA9TVsSAnZWagAAqoUP/iAXeIaB4DBetTTBkA9T\n8sKDL12NS7OFIUf2sCxjscRiH+5lm3GMLYNPcnfE7NbcV/YYvjeSFgqv2sSZ\nIS9G0U8ZgaAEWZ8y5RdA1CmIYomimdu9076P3EQJyDvSScXTnIEUWSxsNVtK\nSQBH6Zk6oqisguqjIQekVBhYtC9D4tchdIN1GoGhdmHLFtcyvpxAIki30ms6\nTme0J5d44nJpRkjRmPmpgu4ljIPSHvOLG6hWg/26wFZJuaEs7ngrv6czaR6L\nwNpkR1OKeD2lzYTtDYLN9z9HAI8AXw81hvzt3vU+eCd9gnc/WqHL3Af1YKXT\ntmZhDuAQKHTUrQeCefrTH4cJ+EaIUFPu+ag1gUJ16anOG1ww1JdlAieNeEkE\noSpIdj5+ZzA2TnemJ/6DsBKO0LJoCZPng/mLh22ARzrsAjQqR1Rw5XuAlXZZ\n7Kq8+CxGLwmlDfZozfUeuQjOVd/ODGHJx3FwYxE1z21VVryCGhYe0HtAkxQf\nEl5BI4TUG5UUOYQYdVkP0m7UjxjLlCrPCMdgVLLaVpZRNtc0TGyw2N7tuQU2\nP4FGKIWXLHzVBwVUEjPzavcmVNjT6BIPnbMIIe6wE8SThGi9SGQEfbv2huC9\n14B7JK2M8qAIlOR1Wm5a6b6IjIRsyRXEbco3iAtT6+WHGV14Tjw6XOJlHO7l\niah0\r\n=DEJ3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD3oGG4gKmL5rZ9hB/DnlIhZvikXxYLoagqn2KEsOyzFwIhAIfwBAW5pTR7mlbl67ZIh/XAT+80FA/KH3pxo+mIvrWx"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190620182744_1561055475072_0.6411009809761907"},"_hasShrinkwrap":false},"0.1.11-master.20190620185348":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190620185348","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-job-support.20190620150522","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2521946b62e8992318be1303586910e8a492239e","_id":"@atomist/org-visualizer@0.1.11-master.20190620185348","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Sb80cA9WNOzp3sP+SIV1JOPw3FSyebViCh6ybgYUdJ/MTzCBrALDAFwv7ij37LsRLpxRc4l9YYwyTlOqn6baWg==","shasum":"e2c7a8bc673a921c8ef8a5ab0b485bfbe5ddcd44","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190620185348.tgz","fileCount":170,"unpackedSize":2582040,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdC9dSCRA9TVsSAnZWagAAPh8P/2B4TIZ20snv+e3dp5Uc\nXKAfC7Acrniy2G5LgSkF1Oxs++qwFQLUbIjM2R8X75VQAaiyk6UZbNSGL+98\n2geQBW54kX8Ic+jEegTUmG8sdjYCFznZSCJUSbK9qxbjUX+2nNoHUbHoPN7p\n14QSiNYgHN/IBe8JAyxznOkBNVbVldlyrUP3jt3PxvL6nWjna70029ZUsOkM\nVQkOnWy7L/Lrf6ptaHGCfiT16jsjoniCjyvIIj9CeCdqCEz1sqBeYxavhBjr\n251CcYSZ5VyObpFSEJp+prWULVt7R1Xrx58Hpi/zUbmeWPGxGr2WZ8OTUBt5\nc4cz6WAR0Db3zuIdpHP4k7CHsI+F9mmCorJ3g4X0y8JndKwqKMHGva5F7J7w\niAyMaYQEXTfWhIfAL3BO04DZPOkgo3Am2zhx7l8N5tSmxRp/H0oMRwPVjlNv\nTCFw+fuA8dzm/fLUPNiCscYTk3dBxaEdLKdlTK42Mnta5XPws6JksrTq2JaW\ny9vE23V4Tb1J61ppCWfSonXcRBJj4QN6W3vljBoviyJG2GsTRJM6/lIYk9eX\ny8aa+6zabAo5G/bBXh0EQxwyIJoyrq4wPsKhhPUJtrest9aKfrIuRgqYoU//\ndtIcgg4xh+v3pl/jmZbTww/jnCAJSmNwbg+KxY2jk/GdEKXNFwO4oig/ALw/\nO4jr\r\n=ZHIh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC8FnVOcu2MO+CW+EB+GJfaV+F5HBs+d5Agj2aDj1cyHAiAMvse/OUK4FRAI/CJvz1ANfAtkjkWfMEDF40g0iODDoA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190620185348_1561057105866_0.7433576785257743"},"_hasShrinkwrap":false},"0.1.11-master.20190620195138":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190620195138","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-job-support.20190620150522","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"505ac2e1bf51c304209057dd27b4a155eda3e1a4","_id":"@atomist/org-visualizer@0.1.11-master.20190620195138","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-xe/Q6pGEk0c6dYbJfoLTLoBj93nHY01BDAOsUaTyWBBAj3+jaf4dhaEOP89BYehppb5EQ+cdXmci4GFAqEU4Dw==","shasum":"b7e573f5e548ca7289d9b959a23d1586c5b59c7d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190620195138.tgz","fileCount":170,"unpackedSize":2582034,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdC+Q7CRA9TVsSAnZWagAAWwIP/1Gcpo107RYKhOz0Dj4g\ne497+fg5IfOujVwJfTxs1pjia0vV6BpZp6b7BfaYMGDci5wuXP4gze95DQTm\nXCNWZUPk0XDAWFy06cWsdGJ2buCeokO7uRxAs9QgcOBJfpJiKJvE34N4RF0f\nHDVeD3FoHFWw8Lx4STRe7QsFkK5vAQSoKXfsB2wiz1IDduIzV2ISPnH6XOhy\n77WwU4HOZt1V1Q/37TPHtOy+g2lBcTOxBylM3pROdAAIKJ4bmC0m2046grl6\nSODtV1i30ch23t8nKMu1JzaCBcyk/qMl7YjQQZDimF12NjNJlM5bHEihL1WL\nwI0LK+zUfxxtwdGtxDfXAa5IHItLisrCu15JB8suLsXcUodSKdddWAVh+A5V\nkBK8WngdYfDJzmiLVTSpqDbKq1W78yGNZlWGgjgvT3oXgCoOWlFP6moR9tZY\nd5NT2K2dQbZ83zNTH2urGQCd1J+JDrTLVYH/j9gCsiFffSqEo86t6+2Qn+jb\n/Rp3pgh9iQZiP/3eUTpi5LL7veNwEqNgL4CN/8rvrPxWD3dt6v1BWgWGEV1V\nr0qzFK5M3RSnlFaWO+a6QFjh9qEXsMYMLnvJdsI4KlpS5ESmelK5bjbV19m/\nncOd2myZgZxcvj/XBfeW9AQyWqEZYCPaU/KIusMLfkSmD2kKIb8vcf3NyrB6\nCWDd\r\n=HFh/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvIHXReFSah/MpVy/LiSv8WUCR3WxR2L34XVG0HtUxPAIhALUywJrBXnrzLSNMxNBCJTfQdFp6UrowXk/SL6Twuhwf"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190620195138_1561060410967_0.19373978156435623"},"_hasShrinkwrap":false},"0.1.11-master.20190620203247":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190620203247","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-job-support.20190620150522","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"47a8589af5a4db70d1d4467c4e558db584609a01","_id":"@atomist/org-visualizer@0.1.11-master.20190620203247","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-8Q3EyGGVeChKyS6VR7wrBvBfUGHwuCb8Sb8Zp8DVSxFK6ZZBl9OyTixz7Fjv1hmuJMz8i8BfVaSV7WbC4LPg/g==","shasum":"4b0aebaa80829fa0c7b94666e6379224f6276b32","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190620203247.tgz","fileCount":170,"unpackedSize":2582011,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdC+4rCRA9TVsSAnZWagAA3OUP/0+fTd9t8gkJ9EuKWGZ4\nKHy3z6e1w9i8/17Hu6DDZtsXerJoV+Y7DPGaWV998/aZW5Dn86pd3I6RT/pd\no06W1if72HgdJTRoetGdjrx4UkUW5b69veUL+gAFQiYRzYOkV9DNYfA+K5F0\nGOkdizOMMfzq2lRVj0y5FAUsNyJZBJEHyovoCqJVfppTXbQpUuPRQ6TdhLE+\n7cedcOFoulC3OBBl5ruKSzq1GfqSX2GQ5dn4gwJ/IuAOdgNjUyZHvbRrZOCm\n3MCWwZQORnEoeKU2X0aC+D9iiiZdFm95dCdV8qzEsC91Vw+a02iK6tdAZo3A\nIZJ5FzFwjyDJzmGi+oALlK3uFZovBr5pm/mlYNPF0vI9G2GkI0v6b/t23ZYX\nNS6Jb7whnQ9ht3zlH0r3ayFbiyS+ZHyhdvECg8sAWp6n1DXXvbu7SHBiZxtm\nkIm4JcoRBVasFFH7M94h7cQdTCDRmI7cEH0Jo7WPBrfLNK0+teefNmYwnZl4\nE2knfkdk99bS0SVWqwhp4WNe2k/LS+DQGH9x2O2PaB12afhweZR5qpe5Ee/f\nyivZI6TqZ6uVib+mfnv8jceG2q3fmMZXfAGq9RrhQo3qXPaZLjzECZIrChT7\ngDcrLIa3/8HGuItbhVRX2AhpEUXY7z6YHb/u91DlYPNgkvMJcMY6BcGyH/gE\nOJds\r\n=qXW7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDke4VXULGF/fK8PIoQXM39MfDb7uPWwDx7qWqOlz10WgIgVHycv+rW+LwJvzZyhhDCUPpO/5EqxS0Nb5oK/74jCDI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190620203247_1561062954893_0.42971581488722177"},"_hasShrinkwrap":false},"0.1.11-master.20190620211746":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190620211746","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-job-support.20190620150522","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e08fcc13944c294b1aef35f436a96201313133a2","_id":"@atomist/org-visualizer@0.1.11-master.20190620211746","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-KpC1tJUESbaBRA+m116MJcwH2USvxGtB9IGsx8oIyrqU6WA0cPr6kko01a2k6/0EAoE/REu9/FHOkHemErcg9g==","shasum":"61af11841f6e456b22d442c128a9cd83df38e997","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190620211746.tgz","fileCount":170,"unpackedSize":2581647,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdC/iACRA9TVsSAnZWagAAQCgP/0FIBLEvqnuAb481bFNz\nIH+amK1C5hiWSRn1n/pSONGsMd+wOX+thytbnQ/2TIHdORSVjfOjoJ0FzZPt\nnupCkYRRiQJixOt8/ljpSqjZfunMf2kKtbHAVDTtzeZAjAuR6T9sp+rt69Ac\n3jutqk0J1w73c/xufXT/+CCXjThs2e26MYVDSqxlQJw3rj0PugBa6S1uqqFk\nm9FVaaK1aqyrAXsLjz9q2Vt5djnM7pUcaXEMDWwh4I28BslWJHXuji1Z8uvQ\nY5vEHNJUCQqo2qBC4mTCwkH3fNpMyTI6wSqt2oTQnPLk6dgtQ3rZL9P7y6lu\nQ0oRqy6kf/37ThORdppGTuO/WCME/FhFmXZKmabFDE0MN9sm9mqsBuZKF6vN\nLpkpGXK0QXHyBXs6/kBfVsEjNr5hnyIUrFII+2I7iEgi9pOHfd2rlP18s0X8\nVH3NmNdI5jCpt9UmEWZaOjzrpqAI5doMCtqwdROmxJvfBG2JC40hZQVRuLO7\ne42zrX/P5e73BxEbFbgRfdAx4werYjGRvm2Va0nakpAKIrEQJMbvp52DTKe0\nAbpc4YVwWoZIh/HvhUKPH26Mz1mMpfPQgYQ6afi0FFtg7SJJSg2EMXGBEaZe\ncIudZWuGpdNE91G36OH6dVPM8dQ7oZ1sC7kBfOEsSOFlNnOQnkvLN6j92FZm\nSttQ\r\n=oKKJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE/IlBSgFJAMHwmp/KVvFz6NqruywtOv9ykz251pWF9FAiAt5dbH93zTMXelG5mA/Fp2GqPlH1wxlUxciQlYvViBvA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190620211746_1561065599648_0.8687775802736379"},"_hasShrinkwrap":false},"0.1.11-nortissej.local-spider.20190621012259":{"name":"@atomist/org-visualizer","version":"0.1.11-nortissej.local-spider.20190621012259","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-job-support.20190620150522","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"900a72b80bde383e611815ebf3cf02410b4620d2","_id":"@atomist/org-visualizer@0.1.11-nortissej.local-spider.20190621012259","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-lIt9MCQn6V9d+GlZq2fnztRcFdwXfPcojhjfswie2O4V0aVKo38+Izp04xifX1UJJE7+Ab7WN1FXI43jUSZy6Q==","shasum":"d591c84d8ab834f1f5764f859a73e20837d26a66","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-nortissej.local-spider.20190621012259.tgz","fileCount":176,"unpackedSize":2606000,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDDHgCRA9TVsSAnZWagAA1tUP/3fnZ8ZNOQ2k+doMx2qk\nKkQ+IgFqw3djtUrA8UeZxI1V1xrZXGw+GBjGJ2/7REhr8i0e5o+7EJhU5dgY\nuBlZUBd43SgY6wKXK6n8dxOfjl9PjJmtwNFBCyeM1H6ecLgv3/FdTxVWaFUj\n4TOwlvrQbD99UL7k/znXqgCRfJqx8DJYalkst+S61qlXjKlw/koeoByD3aKM\nandJFepPmv83eZNmb17Y8LdjgV3g0aFncMhZvwg2S2QUrRu/RIZRQ1x8mHi2\n4EcPAZGM+Zt/af42nWtkP+yrWMU39w0ZeE3Afv+yAtozDETlHs7ffySXnQLo\nYnZEbPILoH3D/QjwZtVXWF7X+J/ljClWpZ1GkANzhI9XeSZ5kAi1EDoe224t\nupSBi6FjT7DAoMFMOMGIRcYSzCHKE7L1HdSN55XGk3lDmdTEYpMrE4kLg08D\nzXteLwbomTyj9by12jNnZRVVpfsbwKp1teu1w3lynjk/pMLGudv+EB7yuV4p\nVnC+58Skj0vwGuSunGwUzpa11lO4/fTxtNLOgE3UHZUPkUKar01W842lt63v\n+q3aqbGn4Os6wOfXnquxPkYd+BothQAeco437rh/zwRebfJThcxqfyb3z1nt\ny0tBodv7E3rb2++2Cu6uNZalCnUWP7EhUlxRq2HTwSQY/m8QQSBq4nK5rTWO\nHQ9K\r\n=LsTw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA7XoNvPrkOLr4bTxE7tmj4Xb5falN4pXf3Shvw0bLGnAiEAhR5HbMnS8V5g5HnHInJ4Jm/vbpLRxm8S/M3JMZ7clGI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-nortissej.local-spider.20190621012259_1561080287395_0.3276385639059758"},"_hasShrinkwrap":false},"0.1.11-master.20190621124846":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190621124846","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cd3cab185b209155ef07fe0778d7134deb5b5b1e","_id":"@atomist/org-visualizer@0.1.11-master.20190621124846","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-p3SPge1LhxJyLJa0rdfW3YrOwDEuarc/UsJyg3Gvm7lRiS40y8c8l39g5p7uUyyCuQU4so5duneyuMr2oFLB/g==","shasum":"5d808047f1115677e2062cfcebcf023d3bdd4200","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190621124846.tgz","fileCount":170,"unpackedSize":2582628,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDNKrCRA9TVsSAnZWagAAscoP/RuRYtgAlw/HYq7uuDoW\ntZJRtC7E5RKIv+9d2MksA7rN9NeRklpCGd6FRyIjZEj/c2vBEn7gP6zKVzrx\n92dxhqXi7kem6WFp3wLok+W+iPpFxJb4Y3Ja//HhQz/YP4b+kx2Me6PPpEFA\nfdka8W/O600DrEN0+LbizmEGD+MMAgzKEgmBZvzN1F9rGAF6ixLGMnaWuGA+\nfetq+K0dRsDKBPQ9bgPRT0MB5yCLu8vFFk5JIIiyegybFmmWqc9S8RVXaDvl\nuya/T8KfwtRr9/dOoJaht+vBZklcjdkZeOI7DOYnyJaHVPENkCBmk2pz/0Pg\nE/q1tCshygaVYtbBblOItAwYqX5EEByqNdJ4NQ//+nbgz34wah0IPRlNV3Hh\nNvZ20u9BpXY/5/wFoz/xii/WPIkRvh8o8/xopINEautCpFabMRk1Wj6oiScJ\nza8WCEqOvDRldNT0JAtuPehdlbHTfVTE8ngAQ/NtiRfHlah/gCoYhlGLLOiG\ninKiEwnHgt84SGjY8nZLtHN/NS+5vcyGaLDm19tetieee/QFPiDxYx8PHS1x\nVXfr+8IWG+ii04OVQOPfRzZCEVSVUSgnzMpxgC8mPLvajhcI3xeOuK26aYB9\ni6Ftd25tME2ddgnQ7OC3zMs9Z+NUXBNV48Lc5MnTEyXrgLuMlacli92TF0M1\notH0\r\n=YorD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCYlJeHOvebVx3vqGm2C8CBIT5muOX6Lay90RuG8Ul8HgIgbSzOgsbRcuEPnfUiGBvVUWL7lZed1zCBaJ7ZBX3a/Og="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190621124846_1561121450689_0.7736920090817714"},"_hasShrinkwrap":false},"0.1.11-master.20190621185235":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190621185235","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a379ae27665b6fbed1e771a32339f55e03e57921","_id":"@atomist/org-visualizer@0.1.11-master.20190621185235","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-ZG+TNE7OS5F11SqtvsZcnpjtNvmeCbrjs5dbocKU6d+VQ8cwkt3mj2Ap5G+qw7D3ZxwXcoNF4Gd0/SZlYUByrw==","shasum":"51c1c96c07f35a23593bb80084b19253f9071e49","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190621185235.tgz","fileCount":176,"unpackedSize":2606562,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDSh2CRA9TVsSAnZWagAA28MQAIQ524iQQnxpqW/5GxfU\npR3ZvMvJa5O7uTW4JYd2BCkXCaE7nNZTogYAuHYRnm0n3dXK6pA1yrJqDpVy\n8HgS8NkMIdZxTYITPWyJkgtWDqMhv/Q6zExbMtMnJ+twG5+DeyAgwzD53W0Y\nEWsw9gHM2BQlvp31ZMBF7i4sJBsmTh55wWm+kP5LzGxEoQfJ+8Ana01OKRvt\nCdXosAb3YOBzX+Hy3rGIbZCdlEi9sZ0g5LsLqfuRrO9Z+nlY2moRbVlhX1YJ\nyQQ7fjj3Z7vuOuyheWyHOqhf0MRDQXXYIGMzfdeW+Ul56fC6QoBQpzfxEyHK\n3k4FXxfnSeeJSQXSX7gXDlZRooWNNqaMTGIbMsXlTJox2IK1WPMX3rm1leRt\nQoYQLqptAgiGHtWpHaETLOvEaDQ2/QFdDIJEaXRIALYBmNLtpmpaBIYZiH8C\n8dY9ZG9lzldih1euVFcpGkVdb2YslxmIP/5HF8Pns0ESOSTCYGfBumzttVmK\nAMQODeSIyge5f9YVrZ4S+XIRtnHfv4bsCNGND5hPU5skK8J6vY4GfSOJ4REC\nGttOYhCSjphu0RHQNqNw9MVMyGFiYIMeCEievW0AUWMHbJlO1buLmhCfG+fW\nxb3N1LvlERv+aBOIMDpeZbPO8ZTcLhGU90eCKm7nSVVmOMq1HvY2ZNa2WGyJ\nFOoX\r\n=bsYQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCKLHL1XiMjiCFPWRLKQpwS4ev2Mti6jX1ZLq8G0iUgKAIgRKhLCEiWPX059EOlh0DpKgVT4q73xmYYOxoEvkjZF/4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190621185235_1561143414239_0.4259861779726626"},"_hasShrinkwrap":false},"0.1.11-master.20190621205148":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190621205148","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"15d5371963b98eba8cc095c1da59bbacf21ba5a9","_id":"@atomist/org-visualizer@0.1.11-master.20190621205148","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-XysHvXeaVKQ1IkEmmHK8+QtIYMqrXLZffTHmYtQVh0ynH+oaCcAtBIBgp+ARpE2u5QerwfKRPTGfl4CfGohWPg==","shasum":"18c7fde567ce0cb04fdcd48f324198b1bf619508","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190621205148.tgz","fileCount":182,"unpackedSize":2617801,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDUP4CRA9TVsSAnZWagAAXg8QAKRCcPLZ3/b4EdTADC3x\nSEsGVqA6pbZ3pO+DGKFxD99p62/V7LRYyoLtptsYVfmU9RjNtRJSXc2jJnKa\nougFATqkPC/1OgFy8R3hj4RtSGRC24miT/pCTnlv1vQsYaoc5K9cbEnSvirO\nym8goqUzY8xYY+jE9l3Cb3GzI99Z5Df7lIKJR3W1/oQDTLpQUk9wnfFe2pm8\npV3o22fOCLq+wyIkrI/fkfKXbZHiXdgBSLFQBXFM6BQo23QJX9dVO0kKJzrs\niTnpj/+b1Y8TpdgVe23runv6C4hM3aJW8Aqein4cpM1p5a7d0e4Ma+Qoj5iR\nHqLcybO92VDSeyLul8fny5OddfFkDzkChwyiR9Bk40gKsmWMHhFu5O+R5Zp1\ns15zzVPgKpZL1Gb66cnnDap1rqAFLmYFrdID8jHhNVvfuMac/1xCrnFuFPGq\nJxdGyFtuJFP68LmmMAwmIVzTKCX359Tl+gveNhbeIJGmcr4c/shajPFpgKVt\nkq79Q6OYdiShzS9ZQQIwuZhKJIk1O/iSQimKqMvNmPPzZ9WHQ/6lP3qfVwEp\n0USiK+UgRez86ziS0n7i6FdMghW+opkrgtWi86TwZCfoRboFb/NyjfTR++a6\nR5vaZLZmBGZPwp7j2fgu1udZfssjI+lrOg/19BAUzLenn8EfOs+kiHi7kAYc\nClzY\r\n=V3Uw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICkQV4vy4fwuYlPWUjMRBqBq/cGQo+i/IBwiCp4NyouRAiEAzoQ+PgqZLmBbg5FM8bAzb0HxSlTraMnPYEyT6HnGB60="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190621205148_1561150456138_0.2884171925349852"},"_hasShrinkwrap":false},"0.1.11-master.20190621205244":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190621205244","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"15d5371963b98eba8cc095c1da59bbacf21ba5a9","_id":"@atomist/org-visualizer@0.1.11-master.20190621205244","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-7jpeYFBKxHz0WF/sdwUr2+V40sUkLfuHTPnY3SYWxRXTtEyJYuQ9lfboQZlVtk/3qn3e//OTnkxU1rXU0M5CAQ==","shasum":"eaec2bc65480a6775db7fe9f855177c09cb45f25","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190621205244.tgz","fileCount":182,"unpackedSize":2617801,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDUR/CRA9TVsSAnZWagAAsb8QAIZ7vTrBf2A8PHPEZwne\njx5aSPBXsN0JJ5Da3sWA+UWYqgYB5WS+wJr/I0f7tm7/HG5BLdFyPnhjYBeT\nNYXe13yLaeetVz9osczpidCu6bQKmxrEXNnPXx8Y1mzMhXcpC8aF4MITHITO\n/VNIYMw+H+XQW1OTkqxnm1QerzV/KqKujBc5g9k2II+K2EBH6zOBnCXkFEYn\n5zh0jFKxalUcXfPcXMQtxgEPgAixIp5tD36ba4Y6uRKZEZVyLq83u5fViK7F\n9h7hTdG7PwVLmd6MYxX9K6OGLQ5/Z1J9jMw8n4H7+8ecr1f7lK+MnbFdv8IP\npVRrwR9xO/VMNtpQqAHAneygHyoND+V40r18ttyXP9Ob8wrJ9vL2LkreKie4\nDf3yUQMfGKd8k5Xs3KDhJwz6YV7aC6Izms1s0IECafzjLoEra58GEwuXhDnD\n/FV7iTHlKn5THSzxEQDEa2CO31Rrvdr3XafrZ6/XHTMbT3bB87d4WpnQxb0B\nIWAQ8w7WGqi1/RHbHsEa6tmH0ehPlW1NVV+HymVrMCHzmAQCOwsQDvTl/Ub9\nAeV79LmELUSKuYRb0MUKhszo0tJLxQz0IewujRIOMHgnkOmkWjyS0ASRu45e\nL6qau4xoD94E1SZhLiAINeO2JhgqWMZvrPYmZJ2iuustHW+62os3L9LeTaar\nHUZu\r\n=u513\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFuZYznkmNaWUdlkZ4L4I18ftE5JKoPukMKw+LtTrBxqAiAfa/2NgXONRLSX4OLnyMhl/NDj78NJ5+zFsXnOhtK9Jw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190621205244_1561150591210_0.20973861893017154"},"_hasShrinkwrap":false},"0.1.11-master.20190622185230":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190622185230","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"561bf522e7b27ef260305a955d0bbce00700d670","_id":"@atomist/org-visualizer@0.1.11-master.20190622185230","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-+fqKTujrnwmKF5QOadQ7zEwQLUNyPocAzPCQ7WvjVhHfjWa0PzFzAg2mBTklQgosjT2dj1tiqnI+vKcw8SNtew==","shasum":"b63687dfbf1b68dbe0fd1583b0273109094b943d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190622185230.tgz","fileCount":188,"unpackedSize":2632912,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDnl4CRA9TVsSAnZWagAA4lAQAJGMYK6FeqKT8RHh82JA\nm/TwcGp9Ikjq9COUiz95a3wjHSzDxcZ4yDF/Fas5lRPdTIkZZ/SficOMgmAY\nTCqZemIVAJ+su9FoAO9uvVUhZUtW2N7JeckKgxic1rZ6F/S6dg2+J7HXCPdD\nS8nCNKNP5MkQ1xMzf7fowEcETt8nh/jdr1/ZRU6YC5lZkYSqbaeeYu9PZpO2\nfxVoS4TlYtpy4asr3KKdVRI9xlWdvwlTOCYapfqlYUgnsa96M+RsY8fCc2Zy\n+rdI0p1pbrmNZ09kkmilI7W2q1Tgyja6/ccsgbgcHiCLwmJvyXOOADK3uOjL\nA5D9eHTNJn3YC3hfG+QI54jpxwzuCsB//TN7NjcdxFodier9RKT4FNBWhdt2\nNpfIn9ntScPulWS4dhuD7HSx7FMm/6/5h2cSo2cf2Y4EZX6j5ZxkZk805iRV\nveHHOlaaUWUxJwhUBiZwgTh+g7khUGQZ/7GVw3RIfN2Cw/4RzaIAYzxUq9Ib\nvV5bWOaSacP8YcnDPd/Kns0m3mZ7dYLHdkY17+6GsG+KnVDD2DpGcAJLvuTb\nTItq77I8lZp532huOOwLpfjyONCMbs/Ehw84nBWzBgON+ke2ZwjGYdqM7b2t\nZ9U4q5WVc1CBGJXDnatVnPfzLGpQqMY+jzceD50MixmpxuJdtHvgJrQjaECc\nLL2o\r\n=y7fn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC6EnpqNWRTpNjCTgpE5b0xcjoLMu3lGArqX1g7S/YwNQIhAOTdmXDEiddJOo+6aVXxEywKpvUY8mQ+Q2EIQpF8Mw8q"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190622185230_1561229687788_0.03027017706036461"},"_hasShrinkwrap":false},"0.1.11-python.20190622222443":{"name":"@atomist/org-visualizer","version":"0.1.11-python.20190622222443","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"402faaa3dd63ff4f994dcf43074ecfb0fe2accf4","_id":"@atomist/org-visualizer@0.1.11-python.20190622222443","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-BvQmRyLM5OYJvx7yh7axQUfngX9nrJIZGx59b6RQdKsB6CJwFxFoP+kTkdUtPHhlnLdfF+nSC7HPnu4GG247TA==","shasum":"d69cb50a5eb823ffb33ab0a3be68ebaa3d1f2710","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-python.20190622222443.tgz","fileCount":185,"unpackedSize":2623021,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDqwUCRA9TVsSAnZWagAAUlUP/Axo3R6mBKX5v1lqQptX\ngDYPFipE0bR8r0zcDRD8BTOfvBEmFZBne6hw3gQAawhRPbUOc1py5P5LhF8I\nc8SAJcJJRID8/c6mxiYlIhP4idk8CuxLCYemKxYLEVI5oExL1c3mJKuPu3gb\n2SxMEW3UC4QHBgp6PDJXDxkJCEBwUXXRi7hQD9zIkAzdmCm2KRubfg6JL4TR\n92VQ+Wwe1xPzw14w6zKW+YO/HFsIrIVlJoHxsQKefjfcsFTSaXPTWyrRZW/E\n+EVrXIoX+GZzdjf0cf4IQG7wy1lLYHIRSMfKncEIfXI85PLqzJXtVLs3QWpb\nIKIlMfnBSPeEUuI6FTkmkaDdMi3gm+DlSLy+u6NP38xh+Xpn4siDkDw4FRYf\nf5TowlDkuGcFk1lurR2g+ZuEi8fDCP/h9vrIbk7Zv1ykPGlGubLlMDVD7WQR\nXBsoU+BOdD4oYWve5+jGtY8Bs1R4Ka4br4/9YSI+iWKsvKqsLkJG6rpS6Lsj\nBqkuNil+xQ66zjwiJOv6zP/6pMm6fqs772eQMynq07LSWUWmcOoUSdFcjAWi\ngn/C5+jqHpnZu98x/JHIOn2xVD9pvwekNeJKaTJhfUU4Rj2Cm9OwqIBvBsBu\nzd8bLa7O38x+ezQqvN4vTy6fz2uUaU5tYYNw2TeaN86QRNvW+bR5RhZZrhMA\nnvK4\r\n=PUf7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCVLZz+oOK8Nnt/Gn/O6FT98ZgBpvLLaCOMdDuJ5cklmAIhAOFg2P4KNdh9Z9bxTEn0uU9yhuVjQQEz7zDo3XgTzuL1"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-python.20190622222443_1561242644244_0.1875386767470899"},"_hasShrinkwrap":false},"0.1.11-master.20190622231229":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190622231229","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"bb1e43187b117c1f09a4008553f642ea646d280d","_id":"@atomist/org-visualizer@0.1.11-master.20190622231229","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-YilHLpQIGlLMm2QRMwkkV8ubtNF60jgN6mlBRL7LQv8uRok6S9SfXE8W3MeBJKFgRiw4voLBDSK4D86pcVu8hw==","shasum":"5622b49359fc628362479e757af443e8eccccac8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190622231229.tgz","fileCount":188,"unpackedSize":2632917,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDrbwCRA9TVsSAnZWagAAZXUP/3RVERj6jQqHs4STnx0Y\ncpyuCiUFx1qPfmGlt+1II01yoUNXwm7MGkrAxL+rw6AtJJTGFEHWVJZlj1MK\nlGew0iGGVef0956OWnGkoM79BImXDXpFgb40SE1F7i7kM7RXBAy2alLv+XGc\nawxQdvUxbHmw6ChOKvocvqJ3x8AxutrZV9JTKxXAgjt/Ba97rJBIXAcmGg5d\nbe8vIdl8ZRRspzosfvs1IKlFqh8+dneyNDO6LEXrh4/z3t03qbWcwimpNMEU\nl40Q2srTs8zxh/gpFwIJq9X0iI3F+77rkOnQbODNhSUp7RqJwUqU+JplWO9o\nmsfQi8kQg5I6jS6MocPZI04E/qMa2vukDihm5uZCtZRqwmLH9VbfQ6pXoHqn\nkeQCx551uEa2mhZN/MvmfAbmuh/140pHwuBt64dicYCGn4huJPY0ZthOjyfP\nJ2QLa1MZmuG+oKJgh+rm3KM0tL/AIsePyqGk5/D037v3x/Pj47gE23uDyS0S\nnzCapIG7KisTCWUNZ18+mDcVjnI6DvOr8FNO4TWe850zbk0vB6JdL9kPrip9\ndKl7Pp0IayOxXYq8sTp9EPC9PnJUV6B4idv5Qn0HbGj/1IE7iDwS8hRRJ0lD\nPt98gTYFz0NoK3zPZeBLC4nqqiOY5A/wj3Wz7cLcjCoaW8IZTd2jEGd8Z4bs\nBKHa\r\n=U+AA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD90eDvSyXxbFLTrKfV5j9wdbWcnjtfg/9j746AmbR4YwIgXE5s92GBc9euujLYg+VgWUzveYccsQDx6h8iTwWXhEA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190622231229_1561245423988_0.23663251401808139"},"_hasShrinkwrap":false},"0.1.11-python.20190623222434":{"name":"@atomist/org-visualizer","version":"0.1.11-python.20190623222434","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2c4ada03b87effd7c2a7245a2718da88aefb783f","_id":"@atomist/org-visualizer@0.1.11-python.20190623222434","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-2TQib2T+MAg8APER2VUxlLa+jovVxcz/ngtbR0q5lljW3kNhtpZ5CztmHZtgc3nuENU6WvEU6lkiQusyzXMWxg==","shasum":"bd9f9916a688d07ad4b0cfd13a47ef03d170a353","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-python.20190623222434.tgz","fileCount":191,"unpackedSize":2638319,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdD/yUCRA9TVsSAnZWagAAYh0P/jhtMByszO0nmo77HtEY\nC3QAMzb1OxApRTxsDjFUiWseQCSEK9MN2lN/KroMtnPYDsxDWimw+gaV+Zlz\nEEOVht6qoRsLC6nmj7BC8Dhf62OE5BU1pppG0SwXah4aqYcmZrKIcOFXzZos\nFwY2HjK+O5ijzWeQgL7m6hSLGvBtRrpkvYBqKO5Q2VZJwOan0w03thBfTF4N\nM5O9ALsbuaGgGvJ+aWk0FcVjj4/0GcW6HXrZ8dPdfb3syzjszkF8FJJvXlVm\nzhRZzOi0uMEAFjkVCD5qP89pNnKrxyzEhRCTTIinrSgLsl477YpIZ40ZelWF\nWVKWhInzLbyHPUQgfzZ1iA8JzGcvwPwIJ0t1xaLkPuUs8afFBzNjNQw20BcW\nXvWfocAj230zwsBbpfqNq7WXHuPTwiN8AaGG8uUXTdW3k4FMtF7pMWkVaRfZ\nLNSdETlpEEZm0YOLX2I18aIDzUqlyfEWaL2E3ofL4NqyawkysMg3soXaf6JM\nTffD6bGf3wDZxwgV8AEcbpv0LuY8b6n4Qk/IdcBU52EOZ1tDu8D/J42kJqlR\n+IDvoiJ+2D4EWMW7QvEz3oFSXiOCPJdImuVVRZMcgcSYA++SUa8ZBOljvA63\noaiDzCm/7Bc5R1eCY6YWJQ37c5fWUGIBobHoTFW6JUmqeQ4KEOX0xlsSUDBu\ncTfE\r\n=K0w+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnn1yaLQ9zxNubqWYHJJd+/TKxowgEPOQn9jn/Z5SkOQIgHz33wtcSbuaPMDah5h5p+iNtaJNN+gYDq+ZDaS0A6PY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-python.20190623222434_1561328787828_0.6155003375257482"},"_hasShrinkwrap":false},"0.1.11-master.20190624120821":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190624120821","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-fingerprint.20190623010411","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"20716328056f591afef29dfa45cdf0b41e0bf5aa","_id":"@atomist/org-visualizer@0.1.11-master.20190624120821","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-IsSW8LBjRYFZ6DckEgm9NhS1KSamoqQKtAzQO+jKpwPNEJEWa2V014R1ZmZS+gI4yA+fupUoz0ollxTkm2051A==","shasum":"67ac7c0286e7518e1ba4df88992ca31c66137893","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190624120821.tgz","fileCount":188,"unpackedSize":2633117,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEL4DCRA9TVsSAnZWagAAa7QP/0SInTbPrBKX9tYxplUB\nmXL+frBSVf5ihE4JPy+TD+BkVe8wWcrSESqVgjSdmuF5lJMYeM1FjCUbkpYk\n+zu2gRCyK1rWXvAZ/ej2v9JyX7Zz79mEePedspK45wMcgKWjFoObHDngaQAi\nRIQote+4lx9AgoBWkZ5RtBNCXPcVyLKm3P0WfKN61O46cgRMSg+ihlNR9Qyf\nsg2fNSrSCCwip7KOczTT6MTEkNMF4HeI8r4hqX1EyvK9dicy2FYE/DJwXfcG\nr4S+vgHA6TKS2yUI/GNcTgA34/hp6DzoXII8z7MDIiaowOa9HOR1HngRQtKb\nqHc11k2qAzj9NgtHR1H4v0mpyeLAhIWZKHdLs3g87UurhLkBH9dl6XM9EWu5\nNVRSYqSQjdL6CqeBawpZzLStPqpA0AsGc0sYFrkSjgDR5IcvEDLDczzANV0V\nLrD3aS8CllU+/DRXB1pGrVL7DuxAl0paa7TXbRWJ8WLwsLXG6+0cK8HdTvoR\nONPG6wDMeL6/wCYU3oed83f/JTTf+hexeVg/2qquu/bQEdUGmEhc1ZNi5CbA\nWtjEnsL0Mi1le8MTioKuyUjiOif8RL+HuZVfwqiXq4YbLN/mhDAgQ4R9oGKQ\nEqMXE3UJwcSsce3Tw80DXztodTYnCTTSl2uUfVCU+LRLAzFD+aRVNm34rIKy\n/nLh\r\n=8EEC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEqBoAvm5aUctG5ThIcQ6+4LY45e8Ug4hGN4ZFWbGCgQAiAxrs8/tPzgEC0UaAGPmRDb7ta1mmcYaJwaPtruPQz0rA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190624120821_1561378306485_0.9281989671516544"},"_hasShrinkwrap":false},"0.1.11-master.20190624145917":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190624145917","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-fingerprint.20190623010411","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b3e50384de438d1633c3fd157b7a3562034b9737","_id":"@atomist/org-visualizer@0.1.11-master.20190624145917","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-26rSf52dCsOEs29vcmI2qaopouiqIyD0z3Fu5GI8fYkb7XGJox76w1XEyptlDClWfdC7W9R3IzocbeP/XYyzvw==","shasum":"d8663ac027684339da251050f410c2f62efa9e56","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190624145917.tgz","fileCount":188,"unpackedSize":2633134,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEOXmCRA9TVsSAnZWagAASU4QAIZv3oJL2bYtn5cYk9Z2\nsnJqE0ACL5mS36gBr3pQWn4LEGVqUx0h6Ta0OBVKe81KVKsUlxDTdNZ9CfwQ\npweJr10hISnSRaT5jl61pxPN6R2Tecg0EJ7hwhrHeox86cd045rtN+6lyxEB\nNW9/T1tkaM88eb/yNdMNNgSpFjJiG2bt2V78E8bEtLcppTYBIzDQGYDhJRyp\n+6n8b9uJ0fZTcoQEwZ5vtDDzZpSbpqSqAvImMOpckJuyq7xr2Uk3PL5810zc\n0cBNqOPNXZtv/yWm+vOl9ll3EbexpF/rwZmxJm0DYDQyljx21wo7UZmXvGO1\nqkrTSkYDAwtohb+Vmk2JX9hXkGB9rvj3jT8IJzvE0ItFitqUbbYhzmk/TSSH\nELp2VSe0j8I35Zdg2U4gtIJVNYCFdL9s2/uHAAGmu0QdPcVa5kuchekAB10X\nYdb2KPD1OKw9PP5HCaC4m99Jt+Vdf6XA+lU6z0eC0tH6mxyvCcyOsgcGm4Kp\n9LhflTlF9W7RBstk40uwbEWeewfi1p5McV1H4/oAhmJnqlVUO8vQBwLp6Igd\n9gRK4a3oyjCynaz1P+O2MNRzhQmQSRQAmQ0e8idmT1mfbXxODwATKZy0skmw\njV6zrwc2iKX9+xehSMWj6cDGXGepylLUlXoa0R6H4mojIadKxwi/dHmlmtyB\niL3+\r\n=Pr3O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+VthtXSf6hd03wb/fQnjPM5CCYjgSs2cHrX6jByR4QgIhAJANtDAikBmmy46HefiSJpXQEeeGCl4vrUTROYvZ+F93"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190624145917_1561388517552_0.9593957302571041"},"_hasShrinkwrap":false},"0.1.11-master.20190624155848":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190624155848","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-fingerprint.20190623010411","@atomist/sdm-pack-fingerprints":"^3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"37157d66c443963a00888e39ab37478ce6135e10","_id":"@atomist/org-visualizer@0.1.11-master.20190624155848","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-4WQk6Rr8aOHtxlXNFVf0bCHLtjYqUr1NUzuUP44uN0+KuY14cV+GJTafzqiTgGAXkDAxHCmh/opPXphe5PGDXg==","shasum":"ab6cf0be79949b000fc431b2f281b55e0e2bdf8d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190624155848.tgz","fileCount":188,"unpackedSize":2633076,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEPOUCRA9TVsSAnZWagAAe5EQAJDRImCPYk0xtbtS+RL1\ntm7sq283JFqNl7Lo4bl4GUNqZMu2X01sBjrbvaLFF5k10VKNVlYL7fNx+ham\nljPhjeAjq2S2I2nfj1EI+1uS6vbNddn0IxcWpjWgyDPVp4OXK5qpCtyzv4kC\n/IbNzW7NCfWM8/FxLrnDdV8tqiQZtUkhrd+i1MLQN6oxDYVuvSonG2eOD0qP\nZ0AR2X/Bs1/voAnI+MAuUtU2ETxt/gy9UNmB2IIIK/kizm+5WQPotcdK6ulZ\nEn6hBX65chf1XJEvv5dZ/GZ2GsGxdDrXY95vChn60TViLNse+cZAvZp5LbKs\nCUeTa0LtR9jRFumaPXCuVa0NUJZnKgHWdj5JK9J9KwkpYp8AIvk2fjWCOhon\nIWSzhfXnYYfCrbxjL5/4MB4hZRUkim4N08p0cypee41Vqq4vhX37VgYSsa/N\n1ZlvThfBrUP6hyJCL+JiwrxWtKM+of0Fkqy49LIuNMbCqchW+T+D+q1Cb6HT\nlYhaoT39NEGakZcNvuz3PxprOKWCUyHcDb81IUZYMVzQmP9Y1e/im9hoOw86\nL8UD0++OrbGlDCP6jLmdDdnILFojrFT8gh65TKcvZQ44yaVEYYNFu9DKaAwt\nqZYwP6E2wvY/snZi1TDA6YjgCe5mqn+G1+zhOCTtJLh7zPr3VG3DvK5NeX+W\nondl\r\n=X3sE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHLWXFK3H2bQzXZ+v7tGR47k1yEuQB2Y1EBmRMK6i1mjAiAxDzXhYCfCzJiUqxivKFvsA+wrgyXovLeoQrxzwRYGbw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190624155848_1561392019961_0.8701445930862177"},"_hasShrinkwrap":false},"0.1.11-python.20190624181357":{"name":"@atomist/org-visualizer","version":"0.1.11-python.20190624181357","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"267024d23b6b5ad06c750d221f6676734e085e3d","_id":"@atomist/org-visualizer@0.1.11-python.20190624181357","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Y0AzHFiGnRxtS1uXWPZkiodkHc/WyhwzQb9/MCOse8Nbty8r2U2zraIAbwZ1SlwMpTeoL8nSSCAGW333AhTqyg==","shasum":"f93fe3a5266b27ca5732d917d32cf6caedb92431","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-python.20190624181357.tgz","fileCount":191,"unpackedSize":2638319,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdERNMCRA9TVsSAnZWagAAB8QP+waFDWuyGL0eJTeeDQCh\n8MQ8yf0IYHO3TwgWkUaz7PMcuXA2QOV5qhgc2AJku7qtKdU3jsuOPTnaHj9d\naFM/Wc29ESqSACnmvVInXmDPtS25zzETjmVLJkPC6fMXnbRnSo3ikG2tMSot\nRJ7mRlEzXfst136cCNM0uTLUlqUeY06lIp292mStbzipwEzjclFH/9lKvl7O\niVlzV9K+04lmhXfEnZ/xTCIFdlArVu+p+sK7Wrhd7K/sk9QL3BlkxPLqSBEU\nvv9GH4Jlz0iOT23Hv1YQxMtTEfdj44oa34i7DtBi99qsPfK3GMrt59hnF9HW\nUFGoCjNmLFMJL7co0awuEgABGjB84mpfMkz6vuzJIMxB4bkMYrF2rpg/RC9Y\ncQ8GSmnlLoxSwozN16VArXFYxOUdOiwBdlxz4SkN1fjviCpXt8AVN7NViiDN\ntoAhIdACto5eS/e0pABW+fTO+xQ5w91K46vaQxL8HwUVHL2Vy0Q7JwqvZKSd\nz/7AeUJsme8uq62FHZAQUlwTh52gciyRCGf2QeU8FEle4AYDbviizoeiUPJg\nhxzaXMEcRWyyWOj53MUKF8pcum2CxeDQfdQdl242SEDNP4VC55Suhsfg08IJ\ncC3cCIq1OyQQeUuiYWXw85Bz1/N5Lh0Ru9TahU6GZggXTCzkzs2nADvegezP\ns8cI\r\n=j6Um\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDtJYeWShh2HOvfkspETAe43QQRT82tWut8ln/DCC9l1QIhAPtiiifF2h9rzZ+Q5NdRTL89acGC8QNgXoTYpvjF9ibP"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-python.20190624181357_1561400139858_0.19829812350137832"},"_hasShrinkwrap":false},"0.1.11-python.20190624184710":{"name":"@atomist/org-visualizer","version":"0.1.11-python.20190624184710","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190605141613","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3ab6959376430dcb0e5d02ffa4226156cda53a56","_id":"@atomist/org-visualizer@0.1.11-python.20190624184710","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-OvJyMbnMv6QbRwOPekK7golyYTIUeLBBihBwr+S1sEg2oq7zQbC1rSHGnKj+JcsfO6uAOXGj4gpmmlFDBfbCjA==","shasum":"d7b1cec586141b15d7bcc99a79c5cd37db3277b9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-python.20190624184710.tgz","fileCount":192,"unpackedSize":2860276,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdERshCRA9TVsSAnZWagAA1DkP/i3kPToS3+qsnicDIYDC\nHzlTjwMo4kvEvnVb7vIXpEn3ft9xR6xyNPOCtljzXnW8sz/gKwnx7Mv4sSgz\nX2UR0VASBDS0jDMxV2ASRvaKQ90EN7JNMDmCY+WlXNIM0QVezUE8yDVsZza8\nNH4iO6E6MjM5FAngO2EQ9y0s7+J21f2PaAeyW0XTEJ5FXY/nwntMtehSOWEN\nOOfwowNAtxgCr6vTRSUNEPG+2QDC7HMwkWBHxaHlg/4n8r2o884G6cez0+ri\n+4gmvucCelUeLgk9XX8Nn7Gp+wFfykbfgFGY52nnUL8GsEv+5kI618csFCjK\nodMnGSoIL+0mOvjuHOh7PAgN1wh1/AF2SVqIbDXGwFhWFruneEMSki6VhXY1\nNd3bDh/oyXHzUxB8qIC0574W8MGWgGvlRZ63EEWu8mWt0DmwgAQWNL/HJ+ve\n1se3mqJMxtrmDN9T7zSBqFmriSWTBesWXTf8MEK0JzNyPuQaKFl7Nq8ruZgY\n+C/pAeS9YDVTZgMA50ipjR0CRuO3i4jPzxu8A8BVGYCvIDg149ODdj1qMCZl\neHAhUqIuDg02AZXrwUPmN+kFP8KG5LwtIMiu3Whe+rqUUd2fMkp0KUgTVWx8\nX3L58yQrm0hbkYCR7Q10D0N9mTfnGebgSy4BRuKUSiEyPCDz/kWuBuLjHs6c\n0T+8\r\n=jmdj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHCoC08LvAIrUhJfeH4qV8dLPMNA3eXwMrW07SZ1z/OiAiEA3ofU6QKIJP3sByFztQ0t14uZ93jyYn+A6+Oyu/BhawU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-python.20190624184710_1561402144715_0.495179710150923"},"_hasShrinkwrap":false},"0.1.11-master.20190624185934":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190624185934","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-fingerprint.20190623010411","@atomist/sdm-pack-fingerprints":"^3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8275238f9b4dc7a42e44bf90c958a22b161bd20a","_id":"@atomist/org-visualizer@0.1.11-master.20190624185934","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-fyCzUDU0UhlT1aYO2kxNKTHONXRsWEMBbvw/tOkRuZk8gDnUEzRoKmHthwFq4UNLxqJLY456Mcuv9qcjOsKnuw==","shasum":"a44f7123fc7ca83f58f937d34a7a35e16eb32982","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190624185934.tgz","fileCount":192,"unpackedSize":2860435,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdER4fCRA9TVsSAnZWagAAHrcP/RtqNvd72HQ4lYZdxRU7\n68lf6VVsW0q7b2kX3ZlUSfGKWHF4jp3b/4MoFVNTlXNxLRmFYK3jn5wMJkwM\njcBeEGcPYbPRUrdtxbpD/g6h0DJ6kt22haUGximPvwyygmp/uUzuC6sRqiq0\nUrNbwFdibN/NsNSjg4aL+Ml916uhiZI3XAKgZKzlQ7fUCIB8KV2fDYx5elIE\nFM9XHXHdbPLLE1w8RvKjQlqnvwmpxWpbZcbYFEipd4NVd41AHe4tuKj+6rDz\ny0dSAH/tbE/qhk90CsYNAmQQ15vgnble08xsNv+McoJkNQcBF1Z44oU0yCgy\n3KdOJzThJyzEdxXF2rmAWUahHv0L/unRLGTxW0MBlhh4fr50PkL4iYTPQzFe\nbhmRgQuBebcl/j2SiwY8y4tm0ftbkvPRIdASR/g1IHvm5pU5bxqUivuIPS3y\nruSzMOUaZpGk/4S59+vjHgokrwJOinrrgz3itLueYO8UnxUQyHMnt4eLXQl8\nxLSZcEGN7uj/M66/vYUB8M0BJoW0djaCp5MBpiilnj4P5uQyDb6RjywAbvEv\n+W+ZrzMHXwm4MHW/c56JmeodgNBlWsDtk9i9k0Lo52Yc8fZK82lERhTpa1HX\ni900xR9Fo9Qk9PNCVZbqfDOjZDRU9Gc0SrCBqjr0dNvdcuKrEZKC99pR+s1f\nlSUz\r\n=yTfz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDVCwKFceA9uLzq65Gf3Cta7Y2FQY/L7+2xuiVv7xPcKQIgEiJy00QveWcpBfkNMXlEHExYQRHHxS8ctYTKVNWSalA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190624185934_1561402910911_0.9017291499435784"},"_hasShrinkwrap":false},"0.1.11-master.20190624190500":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190624190500","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-fingerprint.20190623010411","@atomist/sdm-pack-fingerprints":"^3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\nData about each repository is stored in Postgres.\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to http://localhost:2866\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. Project analysis framework, from @atomist/sdm-pack-analysis. Scanners extract data\n2. Query functionality.\n3. Simple UI using Handlebars and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d9017f93749171fa9429a1c0d53f11de79f68442","_id":"@atomist/org-visualizer@0.1.11-master.20190624190500","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-uUh1AH7hZjqWMIEjM7U/fADSbTf+9OSjThaPosbDmStPOTENaV+IaVXOtIBY/29rheqf7j2w6AVLNLe+6+nWsg==","shasum":"d65dfc60c6adcde7b28b494594b69970eaa392b5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190624190500.tgz","fileCount":192,"unpackedSize":2860646,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdER9KCRA9TVsSAnZWagAAi7sP/RV9DatBRS6oAnC3ZuYV\nEElMRHJUuRaPmcxywS0/8ueGjwZf/8f+TALk0xS44tn6in8yFtyE/SVran8Q\n1S4OsaRrvbPpUdn6dANP4ZMcH8sYs3QWx9djs1dXzxjhcxgPDFhOkwMCFvFR\nqVBj+5pcDlQxSJhh/+XeZ9CEE8CigQrxEtibrhg+lnh+Tvn/B0pS6NuZQpJq\nwAy3Fps8sFJww9o5vOtGtsTrKY3CayiH4QdSrNd5DzaiAKcc1IxKCJLAD6wa\nbpWFHOBeUu/KLfp7ad5vN144G3j3bS7POXHHU64xo0JbwGnej8ENYh4xT2J+\nSvxvw4xs0luKtH7i9bTYfBvZocuqApgJWkR1S8g/ZzESpFCSj2ORyZBEWms+\nPQ2T8I8BLrzUbOteedj9CZKOGPLmDiXybDwX0mHFPKhlY+bx0shm1szV+6/A\nZAmDz8t8Pmvfl3V9OvZ7w8oN+Bv+cpIf7/kDZ9ugao2l+ym/z41FCiw3s1cn\npauYF1SnqaJYMPsejcD3mfc1MF5K/DwFEm/EwVToL0R/tnqjZVgxfed8Hvlb\nBJa85H6adFiDfdgLd1zQiS8Cun/GrG7TqYWffdfLO5kmw66s/8n6mIz/XHk/\nbDA2MPYDc0U7R7aRLUYUtKNfMdHm1GGe0fxx4Cq23CQDabZr3/LTmXMvA//X\nAT95\r\n=1njY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRWe5dzmazmJTi4ixVVFLi4kUEbpGM9NfzieT0gUGz0wIhAPs5Al3P+7GnAGbkMEXrIIb6HelJkI5Rf0NAx/EMo1fH"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190624190500_1561403209750_0.17370389063829084"},"_hasShrinkwrap":false},"0.1.11-master.20190624210200":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190624210200","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190610233255","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-fingerprint.20190623010411","@atomist/sdm-pack-fingerprints":"^3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in Postgres.\n\nPlease start Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.confjg.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>,\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\n### Other Dependencies\n\nYou will need the following installed on your machine to run this SDM:\n\n- The `git` binary\n- Maven\n- Node\n- npm\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8a07d9fb4c97dfae1b220ea1b85863e20a864915","_id":"@atomist/org-visualizer@0.1.11-master.20190624210200","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-7NdDTcxaGlOKm4/Ao4kghBjgBNIfuaD/SznOsGWwwgptNiZ0ggRPFucuf37P5tcuObo9eY4phAbsl0CT3a1srA==","shasum":"6e1089913ae7cd5c5c1f81d44fa88b38526f26e6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190624210200.tgz","fileCount":192,"unpackedSize":2865081,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdETsiCRA9TVsSAnZWagAAD2IP/Ak1Lh2maOgCj3U7fodD\nGPYJhITAZeBpPlfGDTsU3Gt2pip5vs7aoYUdfUb/GBJee0hkFMkM0MUIOd0S\nv5h/hEvDooRq+/AmZ1e5hgZl3UMAO2NchxGYQgtkzROP2s9+eD5LObN1zCy7\nmRbDzWS5EtmIF8CQ81w/JptJqZVt8KaPRJmuW9J1hlmvaTWA4VAdRyaE8U9O\nOpsbeQ2M2Sknbs2dNIGBCbMRjFURvgZy+NTXm8RZgEhaY/YO4n1muBfS3Wap\ngAtdL7AbneYBWmx7ScDfx5I+cuqOPbt21wOIbWZ9XuVG4LrB/dgqdtUQ2gjj\npmJjDv4H6dM/FZM9F//lMWt8EKnWe7f5s4y4g0Em4+PzHLToa1sEgm0oYc0u\n6DvJst5oIBIeEDx3f7vUOR539p+lCzB3zqv8ixZMb+dPYTWg93nN9jC6Ob0N\nuKthoi3YBZ+UiqeHOsOOSwCYYSAyf4NPBWUp6Fd+METh84V/pxgutPv4kNlT\ndL4UXWRYpEdwzGyw3wMcg/tVwdr1INdWJSn9Egl0eHbEKnIiZTn7Nd5pbJaV\nIdp6yjcuZmwzyXMMuUlBhyZ0VhjCmhNmsGa3vMyKB0HaN+yylPrry2YRNFcq\nb5Zv3IpMy0i16ND93mOhGLfPjVBRZ8i1rQ+LvZm5mFP5+U+3eiuhDM+OYed1\nTo9k\r\n=x7Hx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCnwxcYGayG8TzNyniOzRXjIm/2L7qSsaWtDm5PZJ9CQQIhAK/Yy53nplYkHrxGuIujekgmRT1ooqjMf5kHyIIpqVUT"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190624210200_1561410337893_0.7985445771456867"},"_hasShrinkwrap":false},"0.1.11-master.20190626224014":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190626224014","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"^1.1.0-master.20190625175337","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-fingerprint.20190623010411","@atomist/sdm-pack-fingerprints":"^3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in Postgres.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.confjg.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\n### Other Dependencies\n\nYou will need the following installed on your machine to run this SDM:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\n>Use the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d83f798cc1c39b3d411a5d37a7291adfbcf0ecc4","_id":"@atomist/org-visualizer@0.1.11-master.20190626224014","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-GHDs8aHZvVj3WcXqfMByyI3YzOhOHl0V5zgeotsfFOPr6KITC+muR7zG251xP72KqG6OGhUpxdsfdhbt8YnI3w==","shasum":"5ded48fbd3d201f4b3183fcd864e25749b9a831e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190626224014.tgz","fileCount":201,"unpackedSize":2869829,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdE/S5CRA9TVsSAnZWagAAgtAP/0P4Qjl49wPP9L4o7JBl\nRLTNtYGOIxwNg2/9vpgA54gqrMJ2HMp9xdLZmmxqZTQIAgDNfQZKq168vY1J\nh3+HHK1QfWZCLFO0JsHNnQu86e8RtnrL66imE5cAPEVQuSTIcLc95sVwo1N6\ngTSHRRtxZ06nNi4z/F09FJEvlgdERz2EWSWhzhMhA4rv/ue72PDgGVnauvjq\ncEMW1co7wyYjAL7yd+2I5O1N+73MLxEglZHyMsYC2UlwjP0KgD1bZxwxQIsT\njuKwvk04tDaXmV+k6qKsdCO6/nqlvxgLcKrMy2DXu1s2i5wdW78L+DB2Xqbj\nG3LjNOiQz2OUTIrv5tkPTgl5KNFJvmyRnwkY4+tpvH9vlbF1RQSZPxqoZnRC\n4O9cmq7QNMZAk+lEePGX6yHkxHmEn//pP+t0DEj2DC4XegenosqG/lrVyk0/\n+qgJzfz3lcyvXaES9V10W6m6YoK5KZU4DmRSrOrT5zYasAAEU7l00Nh3kkJ0\ney6Idlq2g3gHnh5l5/lwix+nwzSyIX1+ksZN11LE/+SWdWQoHXPkW59pdVmj\nhIWVAYyt7EjkH1R3KLMigchsly6jj9lnndmZQz0y1gC0e3vhL0ipWk13fttm\nxLd+BNh9LAzUZi/I1fxT+zGrKbSllWm2hNAN/FInHitO2Qd/STexewOJ9I4f\nMqgQ\r\n=w50d\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEK6x92BCHlA+jxsbpuii2xkB87zdjrkaYgot302c5EjAiBgTFruxNPX+2VKkyHcc1mjcqi1lSauN+Zp09J2DD3aDg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190626224014_1561588920899_0.974128292461709"},"_hasShrinkwrap":false},"0.1.11-master.20190628004255":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190628004255","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"^1.1.0-master.20190625175337","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-fingerprint.20190623010411","@atomist/sdm-pack-fingerprints":"^3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in Postgres.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.confjg.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\n### Other Dependencies\n\nYou will need the following installed on your machine to run this SDM:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\n>Use the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6efed9fdd025055e57db2504b8c42b18c2a3a3dd","_id":"@atomist/org-visualizer@0.1.11-master.20190628004255","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-y1OagvsVE44XlD9/9IksSh1rKRk92jzjqKoH/pH5hGPix2flqP99Mbfw+BDJ/+ZFkJFr0/J1DhD88qboJZnT+g==","shasum":"86f945e28e643af36c67ae15243f2fdac7e608f2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190628004255.tgz","fileCount":201,"unpackedSize":2870020,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdFWMTCRA9TVsSAnZWagAA9EoP/3WFimWDYeBGUIaisSm1\n+d2dY2Rz3TG4CMW8PNMFj+fqGtF2Ab8J4okuHKOPUCQuFc6jdnwS98Jeei31\nvEOXBj3jqLDG5JEgYyETGY/86EGDg/u4SEiGmm5i5VKxtnbOK/JMvuth7aXt\nC+/vrwypSh6Ub/qYyIGd4ycKHlbWYb6cLDqSbca3zA2/8tIPuuSRxVqxJ4h6\nONh9PLa5uXiFebhGOtvMWlhYo7WTABFPUIsu52LnnFEMFU9gDvl3yoqROgap\nW/dfJUaPP/WFaH3aNbT7OwEqU7E11wjLZ6qMq55VBJvZAA+hYJ5t2ULUHoJR\n6qk1MUGiGgAxCZJHT0kj8SOw9/kDGx0OYKnBOM5IqUqdJjI5FcwwfWZFAtcS\nmuc7ulDK4z0JGwwTii1j0vxygsgS0GsZjpuDbWCi9LgIhwnPNNW4p0wgvXMi\nJKqzGLUuzE4p6LYrsV15VdzuvYEdvjXrgBpSoaEcENvkUHPfLcbfisnA/VWC\noYVaQPIIeHy8FJcDMlwo12aHcOmGpf3gyHtYYlOwwjozXuR6nFAAsoEyYXPh\nFb9p7kBNBtvXtWr8w/i3mEIV5UvYV8eSHRjCruwmY4aqsf6aATUTFQtPAwt/\n+wiwWVGOw3OQL8/VxScOPUJjIiTRS8YtZ8SIjaOM8odlLw7Gzl7Y2coPZQUj\nb5I8\r\n=Uksa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEhbv4XACepDTL8nsfMdcUYDY/l8z/y1GpJtXmAHL9+rAiEA4WY5QTCqHujpzgvaaq+jkBv9vqaRTitoyLpWPOMzC20="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190628004255_1561682706591_0.3635665730537203"},"_hasShrinkwrap":false},"0.1.11-master.20190701031259":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190701031259","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"^0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"^1.1.0-master.20190625175337","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-fingerprint.20190623010411","@atomist/sdm-pack-fingerprints":"^3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in Postgres.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.confjg.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\n### Other Dependencies\n\nYou will need the following installed on your machine to run this SDM:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\n>Use the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"46a44d426912c5a3cfe53c489949867e189b82a9","_id":"@atomist/org-visualizer@0.1.11-master.20190701031259","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-urrnQJr4Q+sl662PntlpXiOMeWECJpEb3kN+eh5ZrlFpppChHeXHHLPE0ETDkgEmUQcxkCx4KnNCIhZbD9GMcQ==","shasum":"dc921e7430add7cbba826d422149a1485624f485","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190701031259.tgz","fileCount":204,"unpackedSize":2878058,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGXrICRA9TVsSAnZWagAA+4UP/Rvc2hioOHAbrqn3L+TH\nvl8A1twdUOXd+Yug4WoB0lR2L9PSayjot3Cjzcoq8KOHaJPVMXAix4ivrCWd\nITutVcQAQA9B2K3aYpry5GXJvz9za/E86fyDFoADQyB96sM4qPbMcLEiNO0m\nhXSXID2WBlni1FMaIjUrt6uJP0eKoKU4HSeIRWGhrVQk7XQB51eFFeLZSmfO\ncHDAR8ZZjO7U5jG76eF2zIOe5y/bvMRQ5Xd4tmlYRJIZcvg5G+BEP79PQYf6\n4VIGlPndDdN+n5+nYMojndhoHRMN3Le0izhN5WgMSMiaKWKK/pbkDgC+KzXq\nvaNc+GiKHvT88+AkY8TH99rXhzJc/VXijKYVxmLqCDrkyXLrRDjaBMpbIrwh\nsTkeyXe8mEHvuWWStdUfPQwsGXqpAvxNtLbzddxJ+pkId1N7nUxWLv9sWIfA\npA0NEOLDGwIvnF+jWOhG6eHSW0g9y9f/c4UKEk3qzHryCUPbLl/On4EdiN/H\n+u4bjSfDgCBzbdPtlqrGpvwcfBw3ya/f5+P3wGKZUOylbLpwyoVcFlZ30VCr\nVyg5lDcoygBkyVDqh0vDvkKWf7OvVgZrLNbjnGWGIZHcrqfPf4BT6UgcAosd\nXfZxdyrC1kZ0rlesUosQr9p/MwTiwjEKEtQXOFR8Qx7chUFrg7NNyKu888jO\ns41f\r\n=NDKZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDwxYfrrBbAGBTN/IBmHLtAOHrGhEoboP0DVtamO2x3UgIhALw3qXIy7ktC0NQyR1Fhkd8kcozrg6StPGwJUq7AVZ8U"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190701031259_1561950919839_0.6554785885749699"},"_hasShrinkwrap":false},"0.1.11-master.20190701133012":{"name":"@atomist/org-visualizer","version":"0.1.11-master.20190701133012","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190625175337","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in Postgres.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.confjg.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\n### Other Dependencies\n\nYou will need the following installed on your machine to run this SDM:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\n>Use the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"13a6c3688affb46a9940c3ea4d1c7ed371ac7aaa","_id":"@atomist/org-visualizer@0.1.11-master.20190701133012","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-IHSPtznL3aOds5NLvld6Z30c0d/IPxXbuMwH4dHuRpYiDHTB/GD/8hkaEpoOsREiiK1daWBXxLbWQU+QaRpd+g==","shasum":"52c48e7540c6c45b92eee0e0c13157436c8b5a71","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11-master.20190701133012.tgz","fileCount":204,"unpackedSize":2878594,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGgtkCRA9TVsSAnZWagAA8MEP/3guoOsdEpGc9EmxEoJE\nLItRLRYtatG9KrOq+CqI2aB49ukVTlU71TTIq9Alch8dpsm8/bd96KrHpkcH\nysQ6ytKelXMVrQEDZRcT0LC207siEjkq4dKF7eYcARLrfnbYtWV+gaAnrMEB\nQnEysJpfw86zApSypAVLAAobC5TwCYCLTdJZXn3C1pLkZRE7jjz4kJ7HOap6\nzcOvod4yHdOYZeKtNRXXWdxdSPtrJMDia74rwX/jzzsYrnJ+GwdHEVrXlnUz\nwhKcTyLhmP7qkIWz2VDa99SYP3cO4jtGRLk3HJmy64pjuJX9wP4oxNket4Nz\nu8HQw5Jy6usRlcWqS+y92oZ9qCRIB87nFLcit3YW5fWTFqooOh/PxLpgUlRt\nas8iDsPppREPClR6XKoaVCqBSqI5i4ffzsyuFeoYPgc0u0lpy6xqbBRnGxWx\nyvRsHlgahtqRtnubaX0i8i8dy4sOjVOZI4c+uBWlr1G91Ve7f7tVP+Y9Y6r2\nRkT8qp6Zj5Oo+MHNqsolLSq4GS1MT1c61dWqWLXw0Nr64oGq8x/hblILP9Iz\nJ7qEUXTwrcZ/41gUq/FKPtYypc93ADjE+nkRCdCrpmmHO1iu867fDJrMokOh\nYZluTW1ZAll2jUUMZ2sbCwvrOvDsTnhjgO+fcq9CVjb1FZBR+l54ZdsieS1P\nrIBc\r\n=LEPP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDSJn5RJi3cP/hY9jQ2iVv83R/lzFwmCSEnuOkYUsDAGQIgFTT22hFiXm7YuyRi+INdPNIcvpKbwprpN2zcOdiF+yo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11-master.20190701133012_1561987940085_0.7274617485359436"},"_hasShrinkwrap":false},"0.1.11":{"name":"@atomist/org-visualizer","version":"0.1.11","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190625175337","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"a942f2dfe6f5ef51a07286ce8f3c01fb475cbaf3","_id":"@atomist/org-visualizer@0.1.11","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-A8L6hIJsVUM9n9xawFMe+DrkKz/k6GPqWXXsMb/fEWkpJyUOvYv8Rc4/ovZg68foz0+lt200t2kuzjpZnH3aSQ==","shasum":"a38bdfc6c42867b1a1c908ae52f452c2f517374b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.11.tgz","fileCount":204,"unpackedSize":2878572,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGg3hCRA9TVsSAnZWagAAg10P/1uAdDxX/R7gen/EH14f\nDjs4Uf3hR5czOJajqozlZQOQzc49dnUbt76ETfw232f2Y01g9UglnEXwtFhN\nrRsDsZX6Wt713keKp5mfjuHEJ8y9cjGWQn466ODSN7pgFLoFXkApdGAM3U2S\nKlh9z2XLKP4ZQ/IIyw92LylRdTHxasRyN7xyn9qgzJgO5jtn9tYC2GQYet1s\nl9zlc1GY9vW0Tv7W9SEwp8yv/g78ijUhzyCHxPUkzgSd53Wuk2NCo4yS7ht/\n3y2+ZYmq1Ipk7H/L1EFauEPPIEi7A1ae4EXuxZ9+HOGsZe30bOCXR6g/qbgv\nhfN79tEnf+W6HL8Kr2SHM2dCg1eVFLev1jX6/c1WIsIbH+43tujW4jrijPzi\nU1yYWEUqtiAocSEZE1mreUKusu0MucFh8LRrCl1XfiwKlFBDo/R6PsFu/XoS\nIIdEV0N3r2yeLP3PnonqD/DZsaab615hNmOWEpLsz4/eJp9k2diYqa2qYeOC\ngaog7K3VUfEl9jx9EJID2Knwd1IT5SrGNyOLyeG0ckBwngbJB//vpujdFq0V\nxrdoYxFEtOzBJPLlAPGnQczkX8HjQ96pdmmzHklIVw3bkDD+W6K/S2o5fqcv\nkfeocLoVzv8rhZp0yHAs/DmaC0WVRCOnrzAdtMzrsInapysn92RwSiKjH1ko\nmvv1\r\n=0BzR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBwMUnlVX79pqZinMf3QvRdicXNgDn0UE0M1g80WrDHSAiA84J02wNLF5JXzajx/FR5OXj5w11LogCkSsYzYhlfXag=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.11_1561988576403_0.15503093413132385"},"_hasShrinkwrap":false},"0.1.12-master.20190701145012":{"name":"@atomist/org-visualizer","version":"0.1.12-master.20190701145012","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190625175337","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in Postgres.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.confjg.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\n### Other Dependencies\n\nYou will need the following installed on your machine to run this SDM:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\n>Use the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"595677dfdc285ac36df588d7518b2eef8f5231df","_id":"@atomist/org-visualizer@0.1.12-master.20190701145012","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Lrpjj1iQYyoZOlbhm01wm/U1JiUnnIB7EkRhXc0Ftr91W2XgsrBqvwDM6JtDGr5w5I6IVRmke6tlxx46mLYVxQ==","shasum":"68c65b7c6434e3edcebe721410bd444e1fa3d2c2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.12-master.20190701145012.tgz","fileCount":204,"unpackedSize":2878633,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGh5CCRA9TVsSAnZWagAA7KgP/A9wdogbt/UdodCGWX6N\nd5F6uFhAgyoiXTzkGh+sZlHTsC2gq93CXOulnD04LN+USJFX+aSlCw0ltkQR\n8IsPhM78vVQQA7awQZ0RTUL8UgjX9NGilIw+hsWGuYJiU7T1vm7uPR06bbvS\n6jPU31pPOGBEZ71OlzuLLeZZn76ioHr1EOfWGoH6yNCjVLTjccS5F6APuyc2\n4UiJ5UAKXVLdzY7Np1aa6fTTpG3L9X0lZeIPFIpn/QYm26GoX9q4fMqBbQhU\nkvYLI7nRDo+K/REi3hpFkn711Zw5Ayy5+MjMregibWqAP6XUUBMQyMkaGXpQ\nwJEEfbgLJ/o9yiQC4xn1Jw4rfPZhjxLx16MVOJkNHGnYSj5dLxus9Kopuynt\nuC1pb4ghjKUBAGAluAGEzS7kDFR9p6zgV8knv/3+NpdwIYdmqtVdVLAeDmRd\n12AGLRoTyJFeaikCt5pp4Twl4dBRMHU8rDemeLNzT1tVYEBF+Ouvse3/lvGm\nqn8z6LFfp3Xh3ErXGuJk506nM29a4tUXD63J0HnaBkFr2BRjpD2R+RH5zGvd\nDpdpNi+kiuLhkF15GrRMSCk3pdUtKbAedQIoDbPgUXgw3c+BbPeUU85ygQCb\n60j45gjIf5bZt5+xqVifqNf6kar/m7n19zycdo3GnF/OjqBqcfiQeIEW9aRw\nu7PV\r\n=7ACS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDzOFj9TaZX8NwwPjggE4a4xXDuk1QRPjWVSy8ao8ujxAiA7ml26rsYtTSFerYcHK1pbfiKnVLjAMdTb2D4LBkIVTA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.12-master.20190701145012_1561992769839_0.420385155991305"},"_hasShrinkwrap":false},"0.1.12":{"name":"@atomist/org-visualizer","version":"0.1.12","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190625175337","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.2-master.20190619162646","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"03fefcb117aac63e0d680a70cad7b8caa4e2308f","_id":"@atomist/org-visualizer@0.1.12","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-GcG4lpiukscZmdh1yOPdAL5K6vHUFdNegb6B7QWjHBkRJqMhHlH4uDEaOMv6EtgceMmWstlp0FhBisnmrKaSJw==","shasum":"8adfbd0098b1c0d911a5a4969ad9cd38caafdc59","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.12.tgz","fileCount":204,"unpackedSize":2878611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGiiiCRA9TVsSAnZWagAALbgP/jIffjqSfBEYomGAkBGU\n78X1SRJwRWx41kVA2+ePkLdJsHJA3IoFb0i14cgGH4Tmk/2QLwOgqKWUG9Je\nNO0Ko8tVP+XMJgjzR2L/01bvLe5I87fa8AVn2hIQSezC+7N+Fe0dU8YUx/4h\nzDT/3wftf0JA09LhOzocvH8X/e0FWlk3F+1T7aQeBEL+q4/nUHXiNCk0TZpA\nZiCGv6n7NSeGV1I5C8wPFlNNiOO+nmlE9C2S1K5ypG2M4dqCOAlcFFWaZ8pD\n5z0WKVDfcIXXgd7oG3WBtu2cvtEuzCzf5xipKd5BROjXkM3C3u02dF2SYIt0\nIngbIs/loweZJwuwHkMCT6I6pySqVmMehQHm61A0RvEyYGIsd1hbrJYVk4V8\nia8ve4aw50taFLC3y3QMDrOgehylJ3zHWXE1noIJhhhhJUgIeibuyd2IqoWI\nRXeFjfDpTi5yyQveaWL/XjuoE2G3xiyQCJVQhhAt/BKmTHKcMcOW87FMwEa+\n6C6ySYRw/BL/nPKbcMcrLuCv8ZZrjCW8rrZiEs7qftSCrWC7AIDUES5C/rCO\nU0yA4iSpi1DcFEI2pguQPWtHw/4CvKp/2WeCev0pbaBcslCl2qHYxMkj672J\n77+vDCi1POEEkkUw8NPEOKt3hFrCre+kz9dzHad1DCCRBZdIl3xHjaBjpbo5\nw6/4\r\n=Hg1e\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDdQo+EVtHL8pF8dxJbUvfLScvKMR7X+sMe54CvE5RwhwIhAMI/BlJIfcL2IVftBFdTEPT4lZzq0xC7CeZnzZixCGDg"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.12_1561995425673_0.6510713296124275"},"_hasShrinkwrap":false},"0.1.13-master.20190701172032":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190701172032","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"1.1.0-master.20190625175337","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"^3.1.3-master.20190627023512","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"spider<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in Postgres.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.confjg.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\n### Other Dependencies\n\nYou will need the following installed on your machine to run this SDM:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL)\n\n>Use the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n_If you wish to access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"17db9152a3a3b0c59544a7de85d6f6a82f550a26","_id":"@atomist/org-visualizer@0.1.13-master.20190701172032","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-g5esOR5D0p2CppC6xtSg/6NXOSDjXugj7EsknVshFPWSsJmDLBaMTyaNAVK8k6lVetYwSjNXzAUhamHfYd9pSQ==","shasum":"5274da2d2211f2723ec8e773db8b0e871cf5f6ef","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190701172032.tgz","fileCount":204,"unpackedSize":2878728,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGkFVCRA9TVsSAnZWagAAEEYP/3S7zQYIj+FmfApIJRgB\nBKmEFR9Dc4vlBg64VUa1EAja8LwC8WbVvlgY0ABuJsz9xltPmQvJnkWvRvPg\nYN2+2iN/GMCDghT/Nstfj7NrYnP1WeOJNRf6PIcg1BYiR0RkgHCazmdxlyC/\n6O0IinZcBhhc/ACMyY22UTvgiPwU/bIqB+bza6Gg2fE1AQsyoqjzp/Q2DFXB\nqbMt1NTZh92RXvrFa2pMSDHjFZPRXGj6DbyeeYW1E83Ja/pgpeffIdnXstNd\nnIEBDmmRKUKNmS5FlyjgTR7vthMMur9e2fY4qO4YT8MlKFJZSwmwiiFZQbYj\nvC/uv3M0cQwlEP2+toQak6mxFlfoWnopZOBaXsW5gAUXe3FSENvELHtrL+g/\na/5VTo8xfHeOQFzwyJgn9kAbAoXlK8EpdToMLa3sI7OhPIXgeZLRPw5LLed3\n9fkBulEjxTE96yxpZuu2ZJ8AxS8qsexI87QsQhOUqW5Er2ZEUxdNY4d7AJlq\nX0pxjNPtHAX/TWZ80WljvQqWN8KncPEESl9tGhe52DyK/KlOMeVUclWy+WyI\nC76jWdUJ8qQN+Kkn0eV0ozibZYwe8XtIy02gqlDgY9eVs4UD0dm9ap9o1/fz\nvB8z52tfyp+m6BSi7+AS12aWT3mgOhShicxllU9AoBLCFUP3WJL2HmwVFLYY\nO9d5\r\n=0zaS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFp1Joe28sSzgRt75m1je6omxnRNV/ncg1LwDxPmhMHEAiEAqO0ckrn7T0sbFSbqFfQiYAu0HLc9utPnKhVsNgd/Un4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190701172032_1562001748493_0.38603079201959667"},"_hasShrinkwrap":false},"0.1.13-master.20190701220948":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190701220948","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"^1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"^3.1.4-file-feature.20190701182944","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a5e691071929ef83a2690a7d6d731708d0700d60","_id":"@atomist/org-visualizer@0.1.13-master.20190701220948","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-x0n9P7BsMzFlu16OwuDfUKCPWdtuQplbf4B+gn33ofs8935Owi9r8U9IpD5NA9VtBtufIP1kNRuH3U79H1f9IQ==","shasum":"f570f03e494da54824c88e81759185b2cb3bd8d6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190701220948.tgz","fileCount":205,"unpackedSize":2879573,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGoVuCRA9TVsSAnZWagAADBwQAIq1a6/Kauhv68sKzt60\nz9Ylrr7KEwEA5/X3OrLqzZh1ZZgLSXe6autY+lWmIYBMV04S7b77HreNPJzL\n51wKf/5YTJqtKQohV9T2cNn6gagINQRKkShk3eP/uXMDLClb8hCJrrgAhbWc\n3LCg0ACTiuq/TqHWjRxc84K5rx7KoqF7zTdQ8reayUvqjMpo10kkqamZaatp\n14Bw00OKXbE9GOTi2V20mWg25BvWb/Dg/cSx3mM/TzJgwEFLfP8RwNN6ndr3\ncbeOMQParwxMZxENWi5vL0TTS1GEhmmwnGIIqzQih/VsOwUtcfnjXNO/qLox\nwWFy8MiQgF1HrXVEweBDpffLSZrSJI1O0Jr+n++93hEnRT/BLJ2wyCtV5E8T\nuV6jybalo4MWUglgEmNxLlFdYhP+wZgc6wEtt/ucfatlkpy/2s9yaEG8dQGE\nqj0LF2xXWM68IZxvEw+hsrICo13nu2krzSJ7n5eXLUdNef49EZs3dovEYDAJ\nHdTUARgnadg1R3cUpeoC5JPZZkQZ4dZRjDv7Ie8Cb52J3P1N36AL+Ef5jVng\n2vX8spkxES4YYModS+HKs/F9jcK9r0pbHqNr5MppUdm9IVYapX99lVrN4315\nFjIuK1Vse1FK9mc75JAPlieePMd0ZHFsjWpd1NJtXYLcQDaZQUs9o3unT1AN\nmpcR\r\n=U3nc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH5gDCO3pmET8rb9+PgK0t5cpE2p0AyuFpq+Z3Sqah/CAiEApAX9wFiVVcP19YKR+GS4hH4MZMFUINoe361jEcE3hBs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190701220948_1562019181609_0.9075361628629153"},"_hasShrinkwrap":false},"0.1.13-master.20190702003322":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190702003322","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"^1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"^3.1.4-file-feature.20190701182944","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5dbdcdd58983123e4aa0e0471943d837f081e1d4","_id":"@atomist/org-visualizer@0.1.13-master.20190702003322","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Izr98K2pesW3hjUKYrCCz2xJkC/l6g3dxkAVflruEV4uQQgTCw3niuvWt20uH+E8SKk9zGPmy1xchls4ablz8w==","shasum":"4f74188dd0836eb66b4e6bc110282a44df20f546","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190702003322.tgz","fileCount":205,"unpackedSize":2885491,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGqbiCRA9TVsSAnZWagAA++YP/37Z3wbE1SPMbexNYs2w\n6zeelAIHIrZAuXqdB3VmQC95TE1neB1EeI/M1Nut22HZ1VqzQfdIg2KCXoG6\nFFJK8+vnifgQho0+hjzsibwuk0LoyS/CtKEREwPrn6MW6GbmK6m8k66D4gnf\n1mX2FRmFdjrUVjG9vuy7RAXhEovOccEvftipWAQo+a3o7NvNfvWsDYUFreq1\nNytbDKanNmPFNSKvGsQPmFCugOnQmyu62z1GuX0HDFScLYh6lz4QLdc+Ljm9\nz408e96JOdomNgjWZV8Kgng7QfSOds75LXimKDv8qy0kOH/+YvA/ZUw+VbuA\ngvFLpHu5Nw2lSg4Sad/LyUgiqDhdGD4fTOtQsT00eWpGnAz0qt/gUMvMUgHK\neOsKhNd/EcqRYzSw/rT5kE2llt5QkPkMS1hZCcSc3dDP5peMlHstyeokicwy\nIFKG9G7L5UK8lN/T5BAj7LuJ8W8rE/HiceWk7Yv3ubGVtygSOVNPjQVQsSyX\nZXS6Vm1ODX3uR7+s5aE+PPmU3pJwyjWNUpGzdkkrQSQpkWhvy9MgBA4PmoHg\nAR9o0Tsdi71N776wRjMdwwhaDrCQwxRO1tayeN/Ygw5pTKGaSwvJrFbq6N7A\nOr7vxALMpG7NOV/labjb0/3JpE4S1Pxbe1DhAVoXTrTHS1THCtdtiIQ3BRGx\nAnUa\r\n=gtEK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICHvm3wsNlIByJXYMvF9Bz2IBxdGeEM3FIYGQkuKNcjxAiBBgyPSils2+J/V5ixYu1fxjQ215C7n2JQQHgbXSmVJ7A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190702003322_1562027745807_0.831015761200431"},"_hasShrinkwrap":false},"0.1.13-master.20190702055743":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190702055743","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190619152732","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"^1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"^3.1.4-file-feature.20190701182944","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ba825872b90e4b4a9915c928e4b2d81c14829701","_id":"@atomist/org-visualizer@0.1.13-master.20190702055743","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-UqzoI9GQApxtcNFYsqZ8pXyimsRDzs6CcstI5lrtcrwwiE85DAdmHiCbO9epagJIPzoHyDo60IHCnzhkiYl1ng==","shasum":"281f8d43affcb63f01db6f0e338491027311019f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190702055743.tgz","fileCount":205,"unpackedSize":2885491,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGvLpCRA9TVsSAnZWagAAhNAP/AmWINpl2Rz9wJocATBn\n9P5YDhVp+xopOeNWfx0kk9vZ1bpUk08svVmgZsCPFqr4rVk1wb3+vabCRqim\nDwIuXiECmPyJxAAxCfGEK3NbEn5YrafYiatH0o+8ZBQMGXc/H/vKnz5GkEz4\nn7qt0l5Xh08wQhrBmSU0e596wfX9Pjr5DFIvW9iPE7R3hIEHESiIUEitu50w\nAZ7qx1/X2DKeX8HW5s+2ZSnsEWMRSdfAVqZBFTtMEQuq4RLreAIAB25HA3bk\nAw4uL+1GnBDF+r7p9MIpjjYFrBqoF1RM5Z95X9tUpC9OGJ1UGXlCrERfS8pT\n3Ga+k46bu+4OaEhwXgGdBjaqlL3zw3AXwqDCv+8u9S80mEELcXgEfeGg/Ksv\nMY0WyoUZKMmcjn94DwhqA5P9AuHNZ33iaj5dTIKjD/uDXg4Q99VAqx94zt7+\nlOKkY1ulfSjcYuTQD4P7Uie04kMxBYLG3FS5qUEAxnz3x+IzTcxb8qQWh9Q1\nQ0sLSd+xfw1gyGBsnQLUNqhGBCa87P+1O1EL7s4iRRHL81+vd1M6qYs6h5DJ\n84teTikj8dw0VSG8WacXuiR141u/C3sunCnQ44lQVI2e5Nc6xR8bQcM8olAa\nzd6SJpJr6R4eG1wtDKMJoNGRqdb4ibagDQWOOCV1fdazONGkdv88uYY1ltBe\nZ9eL\r\n=wuc+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEsb30LQEL2CGSl0QIGYLm7WgFzH1WrC3ENkc4aT8mlnAiEAvy4a6SHgn57MIj35zLz4j/TRsc7bjuTj4KxcZqp/dy4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190702055743_1562047208851_0.6425616104246066"},"_hasShrinkwrap":false},"0.1.13-master.20190702064320":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190702064320","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.5.4-master.20190628061747","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.5.2-master.20190616203852","@atomist/sdm-core":"1.5.3-master.20190621123648","@atomist/sdm-pack-analysis":"^1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"^3.1.4-file-feature.20190701182944","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"dd381aba0a886fb5edcbd527a4579ebb792d1540","_id":"@atomist/org-visualizer@0.1.13-master.20190702064320","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Xm2yR6pyxzlkpmHymLpIEd1hGX/bGkmbRn4ke6eRVB1jzJLkV1t5PkeycqVWJJBnKAB4oEtkIO7ErijMk+LQFA==","shasum":"03b8b6a536ae8a2bb901c0b603d7f51e8bda5f47","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190702064320.tgz","fileCount":205,"unpackedSize":2885691,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdGv2cCRA9TVsSAnZWagAAK6oQAJLhOH7cBaItey/MF9SB\nKN+/B2tc+OkwmXOdMMTFSp99wiJkBJzU4tXh3SlLZYhgYfqmOBqgT6upVPHc\nokme5re7CBB+Hhp32Gn+hnThp3Ta/btaYaZ+citk0Ke2PsFlXcJQju7K7cM8\nyl8taM9VpWDXaUl+kZRTG1OyK6g5fmYiQbKnsZYhLrWjDN/pCMER6YJqcQEy\n+CY9KvjHsMsJsqLjAK79E9XQ629wu9S9cFcvFJxJfqWg2e7fOEi2afFSNnGt\ns02vcMYpqbrmjuVrhnvpqGpewqKPDy0YwkKF48Q3SV6vPzlZ2YG+9b7OrM7Q\nDpHFpa+Jxk489AkFxnKsy1TgXAihQv7DRLenCZdlLP4gcFjXPBdMcT+ZgnQx\n+Z1XP+b2uB8UxwgABNQe4VGlnIvlT+Q4x1+izyUUQAiGfHIckkp+0il619UY\nudPLA202o6IYDieCpvR2TxtjaEXBBeOP0Dmeg9a/hjVap7QeFHkcD0llOng5\nH2Qwe6zVpXryCn1hjdRxTAtxdmF5lNq7ZyVyrOswmZ7vAdsINFwfZ+4Pyp1z\nQ4R85EMr5cdSjOEftRYM/ALIYoM9MjGECWXzSNEuwbWR4f7w+wvQ8253lUEP\nNhIokfLASgUTxaM6yxwq7tVTR96wrBmUE5Bg/Fv5XGqj5xQCOhX4L06t/ILD\nEJvl\r\n=XXfA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDEXciqpMr6j2smBAjoYH9MKCyKCaZoZpPA9FGBzeM02AIhAM55S3EQd5Y9ByjevvUbzM5vxhUqG51kuBeQ2sOia3oP"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190702064320_1562049947275_0.054763385478859616"},"_hasShrinkwrap":false},"0.1.13-master.20190702121150":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190702121150","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190702115245","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2f09dc634e22173918011682d5e68a790878b0ef","_id":"@atomist/org-visualizer@0.1.13-master.20190702121150","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-sn5SYdJdkti5xnOsm7gALnD/whb21xEdEdkIvQH/JypLL0GFP7gvK9HpwPThqpQox4D+SgvFFNO9OvvAl16rWQ==","shasum":"922ad1aee61156c72bc0ed73af68f3c7c59ea5a3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190702121150.tgz","fileCount":205,"unpackedSize":2886143,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdG0p5CRA9TVsSAnZWagAA05EQAITKlx2gMGNUcZuPQ5+R\nc1FidtbVL0ChD0GKF0v8p/xU3gcz5Zq8vqWHmkuAsjGB9EXwnRMapAys5Wx9\nsc8Y0sA5DABJonLUCODJksdcTO4ww2LyJMmbADIi+ZzHxfdAFqhCSoeXMwgL\nqM9pgNx7rEx/+aSr5RpgnKi94s0VcMCKtnVmMGIJQWV3Q1jG3vdebqf4ni/K\nb4joGfF754QWThajZElaAMHJDeNN/gD5bBPGaK/D6Sp8Wa2C5qiz6WyXSIkn\n6++zGT2aTPyWk58/BvMIGfz/1K7+qxlfGI1YyN19bVMk32vehhK2PpXbZFMF\ngCsn/Gc4Ex9Y/iFWVgJeTU5/cpEw0hbbv4PGT24YQ2LO/Jkq94rDsBEQDzWj\noPTiDGwk0ekkzj+nn4lp9UWkUQrGqTz3R99GSB9oYke8lWCdpsFEftbogtvQ\n0otdY2cIKLEwxyduhXaEZnv7BIMrdU+I08gtIG85fXB0otXs8MYtElDLPLSm\nkZON0g1UPewxFYluXgo4Qnz2ta56GE/nIk1Z6YZ2/T/JCWIjpqi2VzaA9OsQ\noPfcwpR0L2CS8i6u5y/ZzqLkLDB7yWPNKyTFyWfDhDsWnmyrNaN9uwKHjUCy\nukn4890nFouj0thuqC00P8xGhXe/e6vnCu+qDO9B1ZjxdYDgORfKoSiIxVzj\nVMlY\r\n=+aZg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmXMo4a7KK6Atne2XOpCqmeeH1cNvJ5IFqi4XOIlYwbQIhAJ52CHIwvb05CWhkFpLZqvCDaSy/v0DVGRnecsRawxNG"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190702121150_1562069624976_0.6147168275521384"},"_hasShrinkwrap":false},"0.1.13-master.20190702164912":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190702164912","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190702115245","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2f09dc634e22173918011682d5e68a790878b0ef","_id":"@atomist/org-visualizer@0.1.13-master.20190702164912","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-c1e8kMCnBBCyD5SoZBX0Eq3vEe7+x8v2CCyiVAMb++bfTp/Rz2r7imRKJWoXU9HwprZYmlXinXD0X0CucOmmDQ==","shasum":"a393402e06f0146df583f4dfb1528cfcc565ebf9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190702164912.tgz","fileCount":205,"unpackedSize":2886143,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdG4t4CRA9TVsSAnZWagAA85oP/0lGbwpMOyYhJLs0cRhb\nwKi91GUx1R5Z1ZjfNVB3mDeA/TKrLlKNoY0YKP8VRtbS4irdlgzo2ktaRyF1\nwmh5yKzn/VRX+4AiWxp/uApVjp7woQLa9p7rKhWzSF2RSnf1GdutPP8d1O8p\nFLnlPJp9ET24k2oVq321ISCCbzBgqn48KzEMhrGdIbZSHhD3NGivLD2LcuHX\nsv9fBEXZpk3EqgGVi+wJfa+ADbzPyVECn0uZcKxVySy3lHvcoFoiGjBHZ/Xx\nkxsmsT4wc7wEZa2cBQptHITV5ko417ug5sE+0LRzp6+WLfiOzR3uHq0XqXqZ\nQNP41P2MZ1Rb+z8Lej/4Ll0EZCkH93SeVDJeaDLioLr0QOQ7jzgNBCxVW19h\n2xoDZ7L6mzyTTAJ8LId+R5Ye8KBC33ckDW81Ag4j+DDDx1amKVTZF9Xvfe1C\n9QgZyv1qrydoznL+J9sx2d5gr36FYiri5Xie9hB9CUnvhlA9pMP45SCdR4QI\nxSHHjCABnC37ZdGxgaNkmg2env1oxolIPARyc0OhhfwXlsDV6yAGIDKSrGJT\nUy5+LL6HrjSt2rhsBQMG87cASkCyz5trvxqEziQHJNOpDcnFdhy1pPnrasOT\nutG5vvzLATrnvi+Lx7hK8wwSxl+h+98wJnhqMtwxHn+/UC64dqsVc9Hk0B8e\nmCNe\r\n=rB+v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEadeTEFnDUvgxeB5e8cVw8tcUB7bYwMUMQxN38OyU3GAiEAtLzAoI7AD4P5bQUzLHITznBcuH+xJinZ5REP6pp/vHw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190702164912_1562086263330_0.929897698755696"},"_hasShrinkwrap":false},"0.1.13-master.20190702171433":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190702171433","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190702115245","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b7614028350af618fe4fd3e2226372f40a23b60f","_id":"@atomist/org-visualizer@0.1.13-master.20190702171433","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-lsZjsDracncDpOYzEL4rEwTBHYaD+h/lHe9HMZSnh6vhXfh62rOaDin1qtYpu+gxlesAp7zSeJnQybMsY35I3A==","shasum":"b77a5644878677d63bb13f555a0cafbacbe0907e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190702171433.tgz","fileCount":205,"unpackedSize":2886655,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdG5FuCRA9TVsSAnZWagAAbugQAJlOCI8/+VJQbV5nkefE\npZIhJ8WWXm8zBAYKwyCZrnBB8xsnNXVPA54Q/ArhvK5rTaeHxHR3djGxyGrI\nhVJaWt33t8r2X7Lk/vUKIf1C7Zxu4lGlFyeXklnJsSIx7HvgmiPg/aHAbT8h\nQM3FbTTIrk3O2t7aBcvbZLuP1f/1KsiyhUEiX66rliy5BpKWBMEHrViEI9Vq\nMm0zQCBrU6+HhppxtrBOdlisqWaJsCS7X+HnOGoKl9/mbQHRfkajYZEJeKYI\nuBe1595BW/+FZlbRb1i0W10SnTB1XJAzoBKB2DGxwbOEgnscEnYRc2oMW4NF\nAlqK19Oz3cjXz6HY6i88C0OgUMHXICFw36dpWlyFOuncRA+WnrRD/4iR+530\n5kVbFvRhM2jGf5KZiaPJV+K79Yiyoz5pii+hVqzhE4F5AuHpBfKjGViJDN8F\n21yyacvNIsEypl9MLxqAJRAje5MRxO+G5UTZIJ+Bz996D64zhZAHksS2bKFa\nV6ggcWHF5eY6PfdWYondtWQ/8O9AKUekb0QzRmjzdOb48yxR9OXSwQpxhxv6\nJBJ5guJbT2NlFznLq4yOzOUzwPV+794h18WrFDKCMZYsXDpdsenMv+4zOvTb\nuy4zDS2Y5YIlGeel5Fy49xCYGFNh5u2yZmxa7o6CMGjcNCpdQ3cNnMn5CJ09\nDbcg\r\n=CWQ+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDBtqJiA3cHO5TXfQ+HtenkeCaOVpKOgHD0rOY0Q/fgswIhALBRr6dO9qbml9KF3UdP48oezIkscgLToVmKxpD/N+4S"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190702171433_1562087789603_0.8517359511426161"},"_hasShrinkwrap":false},"0.1.13-master.20190702172557":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190702172557","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190702115245","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ab002e11fdbd68c4a7b6fe5121069bcd6440e143","_id":"@atomist/org-visualizer@0.1.13-master.20190702172557","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-dchAqhjqyv0Z26d31JO7dXkF/Z87hw4dvo1PH+Kf6nMHZeff18sC/7Bo97d17YSM4Nka8pTdsraha4YF4+9pnQ==","shasum":"ca240360348991a2395c8e827c4d9a8891f2e2d9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190702172557.tgz","fileCount":205,"unpackedSize":2886663,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdG5QWCRA9TVsSAnZWagAAP60QAJnASkZV3NGYlIrcKZwb\nhf3EdLqL3pgOG+UuWBASQ/kRUGujqkdLBdF0RItH5T3DkQU3HQQrBDZf2KTT\n3GRgKs8qlxprkxYvSLUDbP+rN1l+3+X8W4mbp1D9lECcz1C0jjqBesXWt/rg\nJkDkeGNX5JU2tNeuAFwlLGZBirZgOipdnXNk/HgvHyC3nh8BHvrsljaG+vbC\nZ45Eg7LbNuEu48SWh7tSnnMvvL1CjR3zphSMHgIK7cvMVXrZbE7YEk2nxcVD\nyltT902U63zppOj1MI4TH6LL/0VvUw50yO3fHBzHdItX4k/knvsmjXVTszJ3\nqxmMNmVeCR70Ix+Iy/n5ulLbKFstX0+110Kg/gksUbw6nX189J91kfwqFBUO\nUTSnNav42JTbcgBzqyOK4IuSzH7M8EYJuoQalZYosv5cyM+/lNBGOddZqt0P\n3f2SD2mgAVp3aDFStR5+ddwY6iJLrwmnGwnOEyUbLJy6+toY8qR8oxi2eXMu\ndrwqx1xKInhnIstF4Y5QwGC+184Nb0Uc2qh+EAB5K4b1MmpAdooufsP4GJOb\nbEacpvjRR1F3zj+hWN67OQNj42nMYCsEmW8PAg+ULSZsgpStelkwhLIX+pWB\nbHOHaJEXf1TbXwVHk16qWlG4NeU6mDQo6Byd3vgjpFGFnc8QAThzffgmjNqb\n8+2K\r\n=RB4n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFV3kFUgsKTYBJ6jb5VAUeIHJGQtcZPSfH+wwkbfNzVjAiB96dJ9+iGsKnob5ijMzJAkU8abyFLfDUIgtkPtEvbNuQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190702172557_1562088469701_0.6077084989376345"},"_hasShrinkwrap":false},"0.1.13-master.20190703072940":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190703072940","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b6aabd83b87485f1e65aed82ad25fc3e66410dc1","_id":"@atomist/org-visualizer@0.1.13-master.20190703072940","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-PDmKpNwb+KruStWLWdFQQJm13PCxvdZz5IKKuHQ+5dsRRQCeAtOCO8RCWgSysu9bIuyYawc3pxFup2Tpg4dbBw==","shasum":"343b8ee52f098a157b2ab861d04b4899556d11a3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190703072940.tgz","fileCount":205,"unpackedSize":2886770,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHFozCRA9TVsSAnZWagAA1U0P/1GsttcAXQmXgbWHvMhP\nO1usufWURCo1cp4At4ifyQQb7mDjBjiZuxuBKGCiO1ymUVzDvVZxry0OWAbf\nwGe8wQo5x/Qm6QKdKXKtMZjY1z+vYPuKan6I1HbxfP9Qb5aspRQWM+eYMjio\nehqAcCqb1Iw1S97QheHRZTi3qa/l73TjI4yMXPW3S94uWm+C1S5r4rtr5PqZ\nhBmoFs8lStevtsEAHOYq/8pFU5qRZAFEitIDpoDxx9YXc7WdnLZ9iOboemXj\nbGjz/EMH7j/JwnwsPIBZcW/emxyGwtRIQOO5FA+8g7JBRnTvvkj3VCItsukH\njLEOMzMirE7q+3K7J+ljJSkcPp/2fGfb/ovFds7BQZ2M2bKfKbP999O7Nur8\njeFr6UzJp9FJaBa0LqGrgQku8YD0UUBjfdPWb2fb21Kw5iRhFQMjhfLy1n4K\n2Hf+9zgb6o8klhMM5/8hBUDEsbKQENIYFKvecn8xYfYQJYFEMGVKBuzM1onq\nisleJCxLiqDYMsK/Z2weM9plltdu1YO/E89kq9ZDXne3xZqn6OMNnGgJ0D1W\nml1+O3FH/COYCIuGkQ4vZ3tsWUZPhQm+Njw4JXzihMnczlbfiuC8W6M10H7c\n5s4pkm4Rpfpaol3grh8j6ytUxfzhX7Esl0HHN4z3VoqV+XIpkMSb0+IRt5Dt\n046D\r\n=HgoW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDqlfpj9C5jaRJ5GcKbA92sq/aWU2bKIumC9CP2ghFTRQIhANL047zaSTkI/O2MH0QNVk1eWlXszwekX1/KLRoWLkV3"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190703072940_1562139187153_0.041312572108017864"},"_hasShrinkwrap":false},"0.1.13-master.20190703074234":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190703074234","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"811b3a9e40aa87dcb611a665dd91d398a4a0b6d1","_id":"@atomist/org-visualizer@0.1.13-master.20190703074234","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-PfNqkcoukbgkhxyP0jFUDSbH4IFjRT8tuxfDRD+wPkm+S7EnqfRU6xTENcVd7eWgCavHME19wim9bd0vyWgFag==","shasum":"296de192839177d34ff2d33e535a01607e83ba9c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190703074234.tgz","fileCount":205,"unpackedSize":2886771,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHFzeCRA9TVsSAnZWagAAswYQAJmFQWq83v3b/u4p/qcK\nbOOaLyqNtvwWFLSgC6TXqzyQd/cKvT8KVM5YUwUu0tezgaYVZAM3wqqYBmOu\nZVR5JkhbowwlBipuGPDdciAEoHH68kvbItn4dwFgDDV7sjcV5C8P/rU6ULwP\nAE2pSTtHYq0Tiihb7UDL2cJvb3s4Edx+UnIuLwi+avnXixDmlV3rDQhKmpuy\n+e95TdbflTfa+eA3m2Cg0o86CNpP4E4yaoFvTRgIdyer+4FWk4hz8g9O3qEz\ni5vMi2ZiXMf5FEoOLDpYp0aEXrNtITLApTZ2bZRuhPdQWI/PHYD2mEQ2ldB+\nx0VCNSbfnUQXYwJobgKzTJEmwqu+bS7cc3LEGKS60WbkA80oqVKtMRePi6qY\nxP9J8BYvkRj9HyhMbLsXBL9xziaEskY8xC9YFKcINfzDe4ghxgLHWA+8cX0v\nhvvOgLmiD1XnSaCN5FZcIWO5mcdDAMJ+Al8IXeEMI+F0mbdITW7BQIstc5LD\ng7RoHy3FTywAp8eWNgPkt3wpUU77w6GEvpEFqLSLL6JoTZg9KXpz72TQui+n\nG3PKAXOQBipmgvLlYCJH0ffk9jM7fA15caduBe3dXVMg1C0Op3IT+b2pftCH\nwXXX3vqNJxM2Lq3x3KW56nWHUvLntTT/zg/u2DfWxPvomCMSamwWnSJCoiC5\nk8q/\r\n=+/HJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCqNm1fvuC4ln4yj4NZyvIfHurtPaIEwutFiBIrcbkXeAIhAJkSnPBH4TMvgaIHWmQe8bK3dEPQ5fgUIk200bar7X/3"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190703074234_1562139869540_0.9014660937531871"},"_hasShrinkwrap":false},"0.1.13-master.20190703132136":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190703132136","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4f9793b94472d1552b66565df26529c6b28e58b3","_id":"@atomist/org-visualizer@0.1.13-master.20190703132136","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-y3i1JdF6uZ6MaYU8OoaAcJ0h/7AjyYUsWlsJieKSB85K+ATpXwuCK2XbgFd7jEAKoXFH0IY3MwFv3VlsjG+80g==","shasum":"97ce8d909d55ff7a7bfd03508a733ece7ceee9fc","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190703132136.tgz","fileCount":205,"unpackedSize":2886810,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHKxBCRA9TVsSAnZWagAAO+IP/1YW0DDClNMLpHw3a6YD\ncwFuW4bL8vm2m/KjVsi20jHAUz/MrtKqGXBugV+PDEXeLmApWZA8AO2xnF/C\n4CSAPuF1ZckLBlt+/3lw++plljyTIEuvN4rCa+orT1ly0OVDfXXwpEmXNltq\nNmPhCxGn6+e1wt9OgSyiG2i/TN4JVDcO+w+vLOEoFCD3yXmmGJr0eCIVULuv\n9grm2VY8ntXJs5XfR/YLObaMH9KNINvT5xcD8h/OBB3I0UrItOUVNwnFIvpg\nHPw8/XjZ3GwFk8gKcM2c4on/sjDR8LHEtXzwXHWnr2RyaxBpAVteBx5XlzFs\ntdB8rXyhLSyBqiUlBMD1nbavglZXE1zdT6X7qSRnQrHsWe9I4WMrJJ6y2zNV\nmjpT4iv+8DuWjwZG7TWhalUo5McbSg/yE+Kt0pDdJ95A6bLiH52e26zBi0KV\ncACGJFoK6KRkc1tEbP5ur7GQwf6UWgPTxQwMQ+iBAC0AA26f24CK4hZ62uRn\nQhqX7DlCx8h2gCXQ57nUZBJwRDI2PdI3Zx4O3tr9vtECIdCRIbsdlI0HYR2Z\no+5dyIwBdOr3wnIU+9YXsQQ7b7nPn4LkDY/3Y2gdlDMLRC1GS0s/c5NMf+aS\nz4LTRey/mseGj8++uDtSUyLazdvZa6s02t4psOmsju/EWAMfo3l/0qzitBrf\nwuL+\r\n=CfXH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCjAIWva+Ru8B3z6d6adLy4ahcZ4JdkAjfHVkXKa15IzQIgTIPP48qfhAQrj1yrwO+DqpaUcR+GM7n5+VfuUFLQ8QY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190703132136_1562160192995_0.4570902880342598"},"_hasShrinkwrap":false},"0.1.13-master.20190703171611":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190703171611","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"41a5511e43a0a6fadad6243e6f9ce5fd543d21e0","_id":"@atomist/org-visualizer@0.1.13-master.20190703171611","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-7Ur9x3Awt/qZcBy+EPX1ZbCfFOVItgq7Ul+a/4IrpR1oWzl/Cv6Po2UoN53963bD8wSp+d5DJIII0676Hl5+PQ==","shasum":"a2d8470b70d32ce8cda76bd9b060ec9c75e6fa8e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190703171611.tgz","fileCount":205,"unpackedSize":2889956,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHONuCRA9TVsSAnZWagAAFkYP/2MVJhPw6biWsc4tJJEL\nN/bxHxs1zf8wk8TkrVaCe5e1GMVwzIPpsYZ7F7nLfRlmDTj1ttzX0LtiO7yy\nrPO01OGt0aHe2ayrbBHEO26hygvurnmPD8xFrRnfP5q7nKf773KsjDPy48+P\n5pjUUSXkrYnnuL34pzny10XBtA8P7AH3HZdza2ek5DWPhMN290h7bMy8DZdV\nMKOuP9k0oL9YDhSnJtW0RTPW4rlpvpQ42rVEdQTrjPbK20zf9+kRSIv2mliK\nd7VZ0ieorNjsx6EF6/lYgSVImPNepV3ip55tsFLS1O0Re+NCdr7TGOZy/bIY\n5afpjB1dSzZIB+xOEWnQfFzgJJJH4F3LAkTUPRC71zwA9QbD3xUlZPy7zIvc\nK0LFlBpk6UQlxW07Qpfr1AdO0DyuItjFN+4y3Ea89fFLvAF++tv7d+6JNmgR\n+mnx9mOO3Ckl6t069r81nBJU8e8dTd6s6nbn3xV2vB+eUqekKSAQGHYMaha0\nCRtYJ0Irvng7wfcJjhGkQkZNgbIX6bR953NmBKUMbyaIL3g2lM00zduAYYDc\n5tlPs1K5IoYSRq1oQ4nF3f38pI+4WOdrbT1KSDQlcWc39JePyxQr9oY5GCXD\nQY1LeIhP3pwsdTEGFp16iuGSue3WDXRIXgqGABljW2V+esxBXjPPMSb7QBK3\nSLaS\r\n=Vc8X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCdKdKkFYek8B+0g4ezSL+NTa8c55m/nvhdqCQf/PICRgIgR3Ejrczj4mIAmn7w7kvYyBsbAbQOnSdUzmpAhaftM9c="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190703171611_1562174317353_0.9189897125137811"},"_hasShrinkwrap":false},"0.1.13-master.20190703180737":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190703180737","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"2.0.0-master.20190627102600","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"41a5511e43a0a6fadad6243e6f9ce5fd543d21e0","_id":"@atomist/org-visualizer@0.1.13-master.20190703180737","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-mBCM7MCERV0Jc1oKqwnzPaYhTKlA/5NGodbPgA7sybwJ0Mfsyhw5Vd66vfIw0qS4Mtcp7onUfZdTBBE5ewirRQ==","shasum":"70202296a329e5a793dae283fcb3dfcab205de6a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190703180737.tgz","fileCount":205,"unpackedSize":2889956,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHO+ZCRA9TVsSAnZWagAA0AkP/RVd7dJjHHuIk48Tm7Lq\n7uRHtiDCNiubPHOm0V+d24+ivszn2i5apvJrPEsMHB61d1wy+UFlcXa4mHne\nCAhstT3L47g+y9HDiFeVroy2IU9b3LWD1+FQX5WVGu7nbxf2bO4oxlmDYW1f\nT70y75/4WRmzk1Fz1x0IFJaVV3AN2qzcqn4RvNDKsuHifbJuxfn39S/toWKZ\nvk+MKNNMeYYSzsfIWNbam6wd7n00pd1BFaSwZ9cfGZjfmzB362ChKDj0DRnF\nUIjYlpZe2eXoPjWWRwH3t6wots8axqnx+thO+FObguCVtrDasLHA6QwYFSTS\n4RNVggD/sYx+n+YUIrX9lreOkoS0ScSBXWVtbwx9WhtMtaiByzgUwiWPsbGC\nsmbQHlmKNWc2k3runWcwbwM+n7kzsUTs/hE2uaPVo8DqxsBM6hz0hoBU8gTY\n1YLOxwPow7VR2g1VgeQaYow/tYNENwlxM0lKGpu8yRTlfbuDJ0TikccMyC9C\n2bbQUQmplbBZKnIAXaEPPGMeMOGXgjw3v3rJtqlqz1YZ7kHrqAQbkYRdbb5A\nnE/fXOTqNq0q3BFUPxrVbEf/csyk5ogCSJbsvKnPAgQvQ0GyIUYsqsxoh91c\ncjCKXIFy0MuKH8r6YXPw/8oLxMxfIRBSDp+2Efzbe9/8YoXS7B2GCLK4azAx\naR9d\r\n=FsP0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDuRKzMpdiXBmPeuDmNmJXIv2jtG6uG5UYfXsQCuue5jgIhAIxV9zjBRvVhUCdDtXntteH7hnYooKqshD+760kLot+x"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190703180737_1562177433194_0.25701560296026393"},"_hasShrinkwrap":false},"0.1.13-master.20190703192321":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190703192321","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703191012","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"45cf45af9c1f08fae25b8b84d399239328e2d16c","_id":"@atomist/org-visualizer@0.1.13-master.20190703192321","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-+aDvg3GGzT+aWyhWGSBOTCj5kI/3vfmDUDxpwfUnAQVwXDp2DzjgMSZyQQr9b/PrXSJ2cLLkSCfNrard9CCJPw==","shasum":"066acc6f46011ccc26707831bd5122c97bb80838","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190703192321.tgz","fileCount":205,"unpackedSize":2884030,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHQFQCRA9TVsSAnZWagAAt2AQAKMg2iogo73RX4nS6OYz\nL3afHt6JEHhMHHEKWTSrh9P0SenrbsOy2hfFj0PYzgspftlVH5xQ5j+nZmHo\nwflsTaZ6HF6PQDESjQHFFAt+esTHKTHJXYmOzFrhZODGpzJtibRpwSew8dQ8\nKLvaOPKk0nFP4dJF39xK7k8Phqf2iEyaLGUVOtd6aPei8Q44UZyxkEsWIoBr\njP+7JW2SAi2Fy0Z7xNtsAFjRnEeNu2hlGAMX8b0+HZIx9u2ABkuEO4SxVgJ9\na9UtxOso1V5ZMk46aV2UjUuArrEyatnk18wPwk4Tua/c39wIPBjWRLZjz4th\nTpPZdguwpnbYE15f+o3KZ9SM0sLi/iOBNLhhltQgBZM/MgnacDF6lsrfXvZ0\n4lz+6FbYtZHg0ZEBUsg9BvLfrfuOuWnkUkX9QoerA32AhYAfgLr+DQZqgHj9\nIVwvcKYNh2ckP9rDgqcWB0FKUC/EGNKv1e5tSi3XRDLYfMhVoS2S5faZ3WNr\nzG3fxvqVWRjrZ575iyKbnaUdaJw3DlAFmsI0kVe8+xfOn7U8ZgerlUJ8OVR3\n7QAnkEIfKGlK7/YuTr/gP99WlXF6xaUYwWBs41D2nXkOdeKq+1Ug5H5o/Z9C\nV0i1iDgcGAVkIq9ePcPlBGlCIkHVEK66Hh75y28V7e/d6sjxM7bvd+e0jLE4\np+Nm\r\n=BKPo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBLp+tPFw4hQ71vgxMAnyuK2VswDtai+BIe8aez9k73mAiB3Tp6AFxDZgFCCcojjl+cOdtrJl/Ot4YcYaj3CHDNg+g=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190703192321_1562181966860_0.6072344594785248"},"_hasShrinkwrap":false},"0.1.13-master.20190703202622":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190703202622","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703191012","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6122f054e0fd57e928b200386e845059b017b451","_id":"@atomist/org-visualizer@0.1.13-master.20190703202622","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-bHVZF6AQ7W7EUVbCg2dL6speLysSgUtfXyBSDMlU45e4zHRDMTwd734kqUbLjbf0Nqmp5Bf7Dc0SV2TxGeYkXg==","shasum":"42ac204b4d0eb64b34e242e44243e4a876fc4560","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190703202622.tgz","fileCount":208,"unpackedSize":2892927,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHQ/hCRA9TVsSAnZWagAAj7MP/jMl/C+jIAggCBfr+j/t\nNLTWUIH8kggLkDScCOrTfxNJV5aeHDW2gQWqdZ8kKnwVAY0nshm2/Fl+holX\nxGCoT8M0QsUUfiDIRE4S1Rl2PKZ8eFfmfBM1xzWRmatiwz+p5uvt/yKiEQy7\nS1vJLfmyvfnzeOcGHmlk9fEZZlptPTleugdn05vtK54T0qMhQ9c75eztISqS\nYRc9clJRgBPnxCy+fL+rSU9Y5IHgMBoCocQ8pw/mJ+JPrUykIuE9ySYaoFPH\nsPBNaBDkEUPAbiPMyQ0WqhmzGE4uv6djhkdJ6ZHqi+aJnzBIYvjZ2EfGyuhJ\nzsvGmbsIzy4grVGbSnX9KXQSpglajdXUVsFF/V0sEMkD1hozBC8m0U/EJCUh\n0IvLGX06q6gpWZj26o/4lXqjaYD7D84FbhKa0YSVza2uDTVrdzKohc731FYi\niJQvAnam5okhXWl6bVJX9I+Nwl27+ENQQeTUs/H39jsUr+29Kt5W4ZVci+EG\nwO75uQq/oyzk+cGyz2saLYe3/XqHK/3Cwc7ovzFyRXtd5L7oXwVA7BpQha5u\npkCFTVKnvctNdkKytL3gupe8mqC0e50YTfw+oJugZRLmxbqk4JIty/fBxqMt\n0BIkn8BYu2566YaqYGoSXJbiiQj1Glfe3OX7la3NTCzSdKtpf+oMsLOcmlUQ\noLCO\r\n=fHgd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDBZQYbtZ76SZ/vtljwVysWOysmVW5HeYDhMXaa1pwhEAiEAyn/kPjWZntPFyvOtL3ORl097+piNL7I/2zBgZQyXiMM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190703202622_1562185696402_0.9016968815240574"},"_hasShrinkwrap":false},"0.1.13-master.20190703215610":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190703215610","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2a8f51040258ed37df533a3c14c72e82e3f8fa20","_id":"@atomist/org-visualizer@0.1.13-master.20190703215610","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-lJNY80PJ//YPrNwVRRN2YMGabqGnysdMwE+YMqWyR/XDy0RE+I0hhHb02aTKljF6qjllLqHGSv6iaRvwgBVRJA==","shasum":"6aa40284f1e90ad67e3251fc4664dc7c0c9cf7a5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190703215610.tgz","fileCount":208,"unpackedSize":2893041,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHSUxCRA9TVsSAnZWagAAH6UQAIq8RRAmRLItyshjsnKk\nz5rBCLhSKsVzuYHLnvWHEVFDsj2CfCvuiqpw9LC/Vxw3Y4x4519s8wd7ykw7\nxf3SEUx2XGPELaeorzmtejel+yZffu7Lgxj0Y8BVN9vYJ4H3jTjPprZOLEum\npvCxFEx1vGwUuW8mnaT/fHtLVubo6uwvkHSHz0NAf5S5dx5c45HrIVCbeQm9\npQrTaLk/UlY4yVLePfSDVEn7gd8fezYA8OjOJ6nYwGVocKNWsNOl5yEbjot6\nDzZLbnmCn1UvAYyHLMq3VuGPZCZKczh5jWSu+s7BE+CmQWX9RSznoJACAn56\nwDDSGLq3rqHBddFM9y9wi0VFdMtm88a709Zi1oh0jUbFtwRiDWNPjZQ0zz07\nYAS4WOGxJJW9vYXSq/tsha4Bd7F5fV2c0ATL/s53dJOmRVISKO3l/qDDt9qr\nYcPnTuW+7qCAtE0uO/39b7Un1WQmeQB2w6Zw7ESk1fiPs+jgAiVH/+tOn4Za\n2oY/7XVQ5rilVyaTbGPAbyQVYstXzRY5Pv2R7OsZ1v/pvieip5ARB9E7mDqT\nJovvjINS0d8jhVr2nA4b7zDy7qaWw/iL9qTOvdmlaXP8yJIBF37ICAwhBKMC\n3ARqmNxVaZ7FE3Q8+ktPDQfLBvaDB0o3wysjr6OEvUcf7tqgJygwYhZhiI4C\nx9Tv\r\n=DGk9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDj69WtPCXJM6VnQdtSerHm+bpCLnq69h7Cj812fgB1aAIgFJiyM4fidVL4tOl7KdHBLHeRw4iFhBoo//oeKwYY3Cg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190703215610_1562191152996_0.9539832116268361"},"_hasShrinkwrap":false},"0.1.13-master.20190703230724":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190703230724","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4cb125fc6e0824334ce2a8e286220bedaeaadd97","_id":"@atomist/org-visualizer@0.1.13-master.20190703230724","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-XEHKjP38/eQea8aZIkfRWs4NOVD7tvPQMjm1GogVUgeV7djiMvPE+PTBQeIatAgJsZ2/yZ382Cy1hmUsyHxcNw==","shasum":"7dce42dcc70bbb2822593df743d65f2e3959c4fc","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190703230724.tgz","fileCount":211,"unpackedSize":2896876,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHTWlCRA9TVsSAnZWagAAYCkQAIP/OrfeokxlAp9XDDso\n+Po1/nFI4gyEYKlY2xqt2QXzx7nNf3hJ9vo7Za/dPV7lKt6OZv2eM6Qfxux/\n7y8Do6+mQ6UL9u2zdnt8l+yxeWPpXkxUh5vT9HtofbLBEP8YXUUCprHDzDte\ngTxUjQX8tbc+HgVv/lZOuMIdN8JPBVXIpsBjRz+pO1+RbU8efNF+eLUVJpzr\nDuDquee8i+qTfDFbMs/j2tBRSawQRO193f4hptY1sjlRxoz/zkeNngDBffk0\nix7cv8CdLACeI5DkX/z7j9Ef1YaLQ1ijlhI5OgovoHF0eM6at+IKPSD+P5Lr\nK3bMoJBDZg0sindUasxM4fO2J/1CsFj1TsKJMZEq6Hh/l6jsDA1QvpY4xUAn\nYXFKNuvVz2CzT9C4PQTtTmtpk9n8fFwt7gbsePumT0sBxI3Icfq5ND5nN9L8\nEzZGx1itN/ZXk3eo5IZcXnmy062Y+TXK/+kmSe25mKEelHe0Z0/GNXbtQ3Aj\nbHoRR/rGXPuTaBkbyYB4LYRM0nce/AFGmCOGSBh38zCPzJvteJJCeyTevzZ8\n6xAXImsuS+8YebgMd7Iy3z5T7T54e+BphU7V3CsQ9+omlHTVEtePlc8Jk6Cc\nzp6Ohi4EJbNdS7pXZdLv0ODL1FFROT0ZPdqT+8Y8c64mOi5XRuX87+fsaX42\n/HDZ\r\n=g7ag\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCOyxohK/9FH9zVtDFFBqlEbr2Eg/S70ZUoejSpWLSqDQIhAK4y9CJf1CddIhw1CzP/bpXa+ACyt3QNdq1f93rDeVXb"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190703230724_1562195365339_0.4150741797832571"},"_hasShrinkwrap":false},"0.1.13-master.20190703235753":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190703235753","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cc2b606eb00c6ca9d54e7bb012d2f314be813ab1","_id":"@atomist/org-visualizer@0.1.13-master.20190703235753","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-rM0IEny90f4lWcNmPLDU41nLFbL6ONnD6+O130TaKN46bjJWnAbxyHUwi4WCXbtPKcLMW4/B9vv5r23mnLrgEA==","shasum":"0dfc3d1427a1e5cbccfaa24721e937a9d3a81603","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190703235753.tgz","fileCount":211,"unpackedSize":2897870,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHUIcCRA9TVsSAnZWagAAgmkP/iNzTavAPE6gF10J3Izp\nWmrDhjFF+0GJuvAG+pidOIe4dNblFc5nFev8DMkdoo5rIjj6XLW/2bYl8A9s\nrkZzV8kGsjTrvKbvWfPCVij4OqQfDWKMtSbZh89dqXx9Vbrb7USEkE8mRTM3\nMVbVQoKIY5ikdew9ugIV+bMe19gK2sUbue2BTUzBIB2ehpoKubrwZ/CiCz3r\nDA1BqzgpIJzXAIhlsg9Nhb3Dv22U8KVQaPygZPOethPb3cmv2RjHUELlzxHF\n7IoP5k0fYxJuKiil090jvo6cU3sRlj3nIO+T/avA99vh7aFVAbfR8VItKJbW\no9SEnCnVNWNrBgIJMFPCY8hTa5AKRykjI0e9/dZ4JflWo62vEdKr/IV/O9DB\n4i2QUrUO4VEs+EYXdC7HLc4lTcHcKnQ+al6xGOWce18ZNEVIjdLjPPVQqUil\n57aRSzRyRDeKjkN6C0t5dqlv4E2XzEQpOvoXIZNkKVbtONEwOddSAO/LeIii\ndRkfMGtq0OvCBT0D54U+Z+/6IE3h7k/EKr18VGPIw/rczcW1iO3sqpqb0Ceb\nVO6/M9N3xkZeva/y+z6+oguEiLLGl1NXooWQNPJvXS/+teuMWszB7JtEIhbw\noNyBIiXdR7Z7q+81Vf+7XjobSDhWCwfmv9X4QemwmtOVFoMSyyjwQO+ORjd3\nHGoa\r\n=3ksm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCq0ESY6RzhZSSt4FNn5sKCytK3a6feT7ZjB3cBzmurDQIgJaIICjEfqqzS49ztxL1PyInsmp3iEe6eMc1JJ8NXfFk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190703235753_1562198556010_0.6710977919818883"},"_hasShrinkwrap":false},"0.1.13-master.20190704003331":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190704003331","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6d6105a1f0ecb2ae14a3a4d79e2de4e576f11b38","_id":"@atomist/org-visualizer@0.1.13-master.20190704003331","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-KDK/eGKdxJeVwCVmVJS8T7HhGZGcUO4K5rw2t9ntbYOCwhDBEEXU8/soWGTcWUmtIh5qkz+4NETfgR+Z7K+gWg==","shasum":"197d3b7f6b104ebcc9fba408e6bd45944d2f5257","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190704003331.tgz","fileCount":212,"unpackedSize":2898558,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHUnoCRA9TVsSAnZWagAAUQsP/0q7GhiONza19KvfqCdm\ntyJnwHeRzMDjY4SBbVZdHxga8hDkYKxDLHi6j9qqavYpKkEOF1EajSG1iHDK\nfLO0IrhXxfEV+J3gGGOCfuR/oroegEbR7lt6WWlDG19fDY+wroRkPfky7NHI\n+Atinwcmn0YqSR3YbVWJdd9ZevCto3+d3wHFXqcEBA14WZ+Pl/1zxHiVe+N8\nmAVXuQ/k9crqG0rWxAFDiw35N2x/x6LcGjhkFiPj4RtfrKFTwtHqghatH25/\nJvxpq4W/d5cWSqymkbH7oyEBArP1/pB6ux9HBLMhwkCyvZFbcBzCV/bkb1FY\nVFvH74bFMPLgHP6ywLE+7IqYanqYaioWKjO5oaOhH2S1CTKZ9o+uRhp8pm8m\nx7uTCe49UwPk3648Ta6/MRWYyulIoLdUjkG7laCUyxwuEL59Ecw+PoGDOKd3\n2ldpEvEQFLxooI5ICzpFWTiOOenziRaSSQ6SYWp1aEpu0QV/QveA/IQrZNXb\nhAshHDxBxA/oe+W/AyvDId9sBtWp0Xsh2DTvD6ueKtT6DVMWv4iyfj0kZv+H\n6+f8y8LdfBzzDowJP1EkR5io1C+EhUPvn2v9LIx4C86ynFJwECjQyaxL+eeg\nPM4UAKjLcxuuw6+2h+/Fd07K8zCRU1/a7pSRRe90YGu7j90OAKcFuW6XWwlg\nJ65r\r\n=b/eK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD3xfYTI3uik3JxUZrXkVbEmv9/Fg5qQlXEZUuidWeSIwIhAIZ+U+zSRxrIUvlVVYkOwFmOb4G/B1IzXQSCtOqpxfRF"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190704003331_1562200550265_0.333667828378887"},"_hasShrinkwrap":false},"0.1.13-master.20190704010204":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190704010204","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9e97e7116d190895ca628264b67bf75a0adf76f2","_id":"@atomist/org-visualizer@0.1.13-master.20190704010204","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Zg7k1CwOMbamoi0prg5gpKIiWUyS+pwc+0yRm78C0JaOBpdykFw9OJva2Xo/DmXmE+vj9uxhjCnR1FseT24rDg==","shasum":"703d901f7265582a7579821a66483c39c608704a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190704010204.tgz","fileCount":215,"unpackedSize":2902409,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHVCRCRA9TVsSAnZWagAA63kP/0XnBx2gb0iMOr3UfPlZ\nf+bxeUF+6Ucs5HjW9lRNQ44w8mIm9Vp1PK1cwb3OgruYilXAoQELKp1NXV5x\nY9HhMTYeN+7Mhkx1p8EZHKsHWydy1F/FZsetWK36jnuNjgOuU3j+32/gB9x7\nLSPRHpVHhJAQWUzur325wdgC6XZ0Y1WhqnlnJ6Vc2lVDNnZfP2Y9oTs8aISA\nn1zhITiSkP+f8FEgufkbzyL/9WZSm3OHKJaF7U+g+HdTeMyl/XWwwc4Y8r66\nCLYMHga7G/QvjYm32e7eXYsitmjCeMniJtkwsmkeVH5pwkUxk4v5m/kd47hq\n/d1bS+e3x7TKiKpti30TYrLiEvY9MSOTjjxtufEO949RH+cnS1Zn20sQMI52\nrvlYP5UDUHzk8MzBGx28vJH9eoFQa4A0yDGTg6X6xZBf1cV6pU6FEt/utvnY\np8rvaz8l+f6nY7ix1GFd60t9xDZjhZImkOhz5m32XU/r/3XfBZidaajPD67n\noT7kJr097bf/FM8i1KSxGmvKE3KD6IrO+1w0byT3TnRf8/UdEL0D75mPdbGr\nY3+ZK0gEsqjdkE0V85l3EtVnft8bFnVey+wmdiRMFqcnXL+SMaCaR1Y+tTzp\n/8X4D3ca9iC5MHsf8gtL2KbCgidOkn4RUdwuqA6iVQy8C9LkWBdGAueazZ5m\nUo2H\r\n=b0Yk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFKHoK9KbyjNWDFJuoVkQZbd1DkUh0GRqnrrRHR28CNfAiEAzULFOIxKySsl7WLiuQthJstUQKdGCaS+kOwZiXMatAg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190704010204_1562202256674_0.5347464112683342"},"_hasShrinkwrap":false},"0.1.13-master.20190704014407":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190704014407","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f04deaa4e8666e040f8d4a214041199324bf4504","_id":"@atomist/org-visualizer@0.1.13-master.20190704014407","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-xjypscI3jJgkoMy8gGPyJoHYNubzCCDV1KplhFA8Srlul+r+n6tbKfmQ0Omt+BgslG00HNK7b1fZydyWZyjX7Q==","shasum":"bbbea431e6c30f5d18daa8ccc9435271aaa10191","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190704014407.tgz","fileCount":215,"unpackedSize":2903578,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHVpnCRA9TVsSAnZWagAAuY4P/RoT7abN1hwOR2JQp82O\n1LT8ZXuc0zipVXI6Za/HBzu7Pns+0O1IaZU9F6ylfzRTloN1MMplzVc8WV/l\nVF87JCaKE3UTXJgVMboty5eQwyfQBjIwWhvVhgHd4MVG4yt+V6geThyOl8d+\n3peVPA1/eqow3JF0uClt2omjHHq+o7TuFkhH3AUDht0y60yzMr1rR8LbiKd7\neQNmkHs50vk9h+1//YQGQQh1cTXlNcGR4XDqypAsZn7YukoGNWB47As9/KTc\nm5aXhzcYAWmGgMJV7sz5gCUEiawCGJxEk91UabsXaioioaiQnUfaUoPtn9Uw\nYPL3yUdkglFg71pzU1R08pk1CTJzE49zvMJKFA2q5f5zAa1v7Nu/ygCMeNaN\nxxDuWQtzyGiTP2pvZWsCFckaPfkG+DWXFGvxpdL3NG2BTd0NSiMIsw7YcX2s\nfsHRE6GUairEYBHr1X4i4G6EUqvrA1nWtOyPRLu3hqed+nq2BGarz9wgSFIU\nydjenWkgl2O64hpe+H9HR9gW6vPwPaSSs0ckbcy9UsMrdt3Gu0boxKSo2282\npI91iOk4advcnAAc55KJ/MV6A11JJkDjHQcaUoKwOB/Y8qFaOLBf4tktZUsm\nOIp7PlnWZfjb7s2YMZiPyd/L1QMZbmCnvVAR7kiKhtw6g7w18pVGBuN3lE6y\nGIV2\r\n=47x1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDn/t3gx9OcIscTSDim0sDUOKsH0HOW/ohd4WicdHIvfAIhAMwBsjgY13LP8+5BHxkHxUSaQP+/xgFpk0nrarwRYsbG"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190704014407_1562204775270_0.9491582244371692"},"_hasShrinkwrap":false},"0.1.13-master.20190704014548":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190704014548","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f04deaa4e8666e040f8d4a214041199324bf4504","_id":"@atomist/org-visualizer@0.1.13-master.20190704014548","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-xxoRoN8K0oC2Dp7ByH1Xn0ciVjbJtU/eVBxrtB9mm7VCs+mSMui6q9pEg5lnhVT05gN2fjH86Iks/Rec6zr2ug==","shasum":"5af4f1bcb5006c98952fc6d142ea6e8805a6874b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190704014548.tgz","fileCount":215,"unpackedSize":2903578,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHVrTCRA9TVsSAnZWagAA+SgP/04w5FlFZZRlNCzRfVRP\nBbAI5M97E/ZsnOyf8kITb1gaVvps1LsFdhOh0V3bXGAmiaNzQglo2Sc2nT9b\nJO7JPSkxq7rZ1aOfs4C3DjNkfvwHr+NtubPTUYr2+3CJDkP8V8WovZ0GpsON\n+lejCml8SNjQ0v5b84lXsLwgO2DCVQIil0t7+DaajI/349nzA2+sYvgzpWnq\njlEhM44gnbpKwQ7huqg00jvUXbQ0oDBoaNGAS2i8XXdw3KmDjTQ0sxDwDC3T\nZQLxdOnNJoiFuoXOWvfBTIODumr6DuZNxYxLNbqoNcS49gfpkOK3Kk5NngAV\nCUB3Hma7G4dmBzEQCM7WUNfKehDcCa31Z4ZZAhk9L2e4jqnjRY8TeFByC9G7\nkOLqnS6TS6x78dQU0hr47uZc+WgkNvOGeCi0S1dNf7NYHEZ0Sml9hnznGwD/\n856uLs0DohILzoj/BbMms15NcaCwbY+K+KGIPwvsn8q+xC1xijlcXGXi586z\nyDUpWZNZ0/raZKf3GM7h2R+MlWSMw4kv4PnzzUWqjajHSg5+e44qgarglIMc\ncSodFY94ohY8LbPx+cD7i3UmnWUlix6PFtZ5YaihdGETvtILQLfn4EYdabwh\nuelv7AruPAGaf8U7cRrIsgspQGyjRgDV6ftyLZdKSLcyvDzvVvUEuCCHlXHy\n3Ggp\r\n=oYBZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGCCxvjiPdZ5bz7etJJ5Xhd7rj+1fXNrDLLLAWt0dNaSAiAy7wG5wWtKT/plFabmT9+NItc3bhpackvNPpHPTRRmFw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190704014548_1562204882947_0.47104101199951165"},"_hasShrinkwrap":false},"0.1.13-master.20190704015636":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190704015636","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4d3ac6a46039c74082f139abb358c6b5f52679ba","_id":"@atomist/org-visualizer@0.1.13-master.20190704015636","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-t/ZmygPW9pnBZHrJiKTPf+B9r7rXRS4Fh/v5ucFiLVokjMUGhyaj/0+8cYuPaIFm4J7+rF8AeAgLlPtTKPR5Ng==","shasum":"6e952d8bd32994c5f073fe029a4973ba64d54e16","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190704015636.tgz","fileCount":215,"unpackedSize":2903716,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHV1ACRA9TVsSAnZWagAADQcP/2nf+wnQTvmHeSrWbB+Y\nLuKvfDWbCSggPFTkrA8Pf+u9YiFm1PomvG77clXj6P4LgsP7QjuiXDX62skC\nVAMiE0ElNiAgqzLl8Urc9/PmAzGtwFeBAfOg8p3WVM/adUmtHGVv9P6FQE2I\n/8VP/Avl0l5OSaFKnSY3npXA5OWl819/6Ly7Hn7yYBnE7x45st1GRszPfb+o\nIwrlEe20PSRk1iv2FX7oiJqe6qYpALrRP06MWzOhutL7QdeByKtIxnranObY\nSNco83lrWhGZn+1Z7O/PY87b2i/t3uskNPKi/pOW8D1xp+SbHU2h9FKBC46j\nk5HNdkinvD3W7E4mXYvwVXJ9M3+TZPbFpl/1ax5qFMD5FshbSznM9VymF972\nQvMMY89kadAE6h6lyuXcVwbyAfT0TUlU4VjdhIYSsWVJrubYIIveJxLkYC5t\ni2JsBulVDndNfvoKSFoTuqmYq5h8e0kCvKDKsidMaw84r38l/x0Iujsu6qDC\nHKIRw07VLnEnQsDgYVWwzwJh4MocUG9IcM6XMy+zUiiIs+rJ7wrjWltuH1Ea\n3HHw8OdLngPgHdcvNLF3jVo5bNRXYf+rDvzx3MPY8veqWhaXVoikZvDxCHP+\nEGLhOFTg1PkMG9fNuchLn7t2Mf12PCleXwl0Z8k/zVZRC5PgR/Q90hQwjaba\nDi0O\r\n=4cGL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDNE+q3lxjfIAL/kwPeIahmDjyTyH0PhfFbv7xrfaKIGwIgVGhcm5/s8N3UCMLz0ic95QRDgnhW9UCzfxOAwPDafug="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190704015636_1562205503448_0.7626919393404503"},"_hasShrinkwrap":false},"0.1.13-master.20190704070635":{"name":"@atomist/org-visualizer","version":"0.1.13-master.20190704070635","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"397014d3742950fb374e334985f9a2a6175c1c48","_id":"@atomist/org-visualizer@0.1.13-master.20190704070635","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-118HD6o9FqPTTaAKLOkTYhIKknCC2K8C1ahyY/uWN7KwN1SancEW4mlOz6ymN189oePwk8to3ysNhNs4VBEDDA==","shasum":"c98200f2ff1738ff1b45000670d6e6f1b1fe0244","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-master.20190704070635.tgz","fileCount":215,"unpackedSize":2909285,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHaZQCRA9TVsSAnZWagAAB3oQAJj2TlkzSOJCnn3wYFd0\na5BpDZD9Ue2FLbwQUR4/k9iU/rALbiW+Csx9CCxtd2FAoT0q7zxBRsgcsGBw\n8iYxilWLapedVsOxJ03pAbHtDe3DNeQfOPeZNcj8ltD+H4pI7wPg8SOKINUm\nu4/EoXEJNHqn+1/1yv85kPJS4fpbrGCs6ucPuhZPRNsGNbwKQBnAvW+ULsvN\nQGd2gCwoMm9eHuLkBD8+Avg2Fe3rW7U0Dwc8aM5YfHojHDt1U8m9B7uyCFYH\npVNvRfI+welN9OoIkwtxdJc7OT/LQcDTshAt+4oHi5LXG4W0qn+Til4PhHzP\n+7/UfsWUL9mLKh+gAVafqTvpfBCSAsuiaLT1asgbM4WjyUVqZmkzU4+yhdSV\nVJvrk6mGDTJBDZC1GC/u9MVe1zGTDOllO/Un3O68Bt7vob3FaSPeFflELXpd\nf06qcUJwDf89OekZH0l9iqnQqNnToWQvQYRwxwWcsrSsL4M32DuFl6Ilk7q8\n0xM8O6XiXKy5PrsMqWbWC+ATbC/wOd157a4IF0+nrV/49zqBmMw5Vi8nhTcZ\neZfhzPvkzUbKG7cquAS1orbQwxS/4tDqqRRJza3Vft5Ozcf3WbVIsU+d8B14\n6pYzCAvE2cWDXTVFv5fBe0kXq1Uj4ZsvjoC0A305pHMPZ4VBynaASRfXVve/\n1vH6\r\n=+FTn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDeCB1nKTks4IP96a6ZvA8qkzepG1dpMEafZbIc/LBw8QIgcuE7ZodFod6Mn0lGyZ4aOls4eP3rl4T0i7i5GZ8GaU0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-master.20190704070635_1562224207609_0.597575309371456"},"_hasShrinkwrap":false},"0.1.13-noselector.20190704071010":{"name":"@atomist/org-visualizer","version":"0.1.13-noselector.20190704071010","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f6f964db665a8086ac6797174abfdd3bd55d2704","_id":"@atomist/org-visualizer@0.1.13-noselector.20190704071010","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-suxtzao6PjZGEtJKUWA8BhVLITYiX+tzEmJErEFx8e8VQCiWS/8Bwe350s+WYlsXZkbx0bNFNSas0/DjG5XCvg==","shasum":"26afb04591d96b2f6f6a510e704ba7daad530fc8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-noselector.20190704071010.tgz","fileCount":215,"unpackedSize":2907745,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHaa9CRA9TVsSAnZWagAAkGYP/1Zk4i9lu2fkEk4tV9Wo\nBaIqlWQd/pHV7yDHzjwq3IZR54Pl6RVEyoXuHIZ8qajSvsyZAa2mNUUk28Xw\ntPq9hzwxRMway42m8x83/8G0jAYWWy8MEcOMgFekcnZyQ06zYavflW5qaSPg\n7yIdLZ7uFl3drV4To/m8On6+hSagjyhofjLxxRrT1+3VZ5Ub+4y6mqboDmY2\n86x9XlVG7nBjDx0Ju61WTbHwmVsR9F8+AWvbxy1FMezATbaro6S1wjuLUh4A\nm36d/0zPRsjrycIjsi10Z+MnZFjbXp/rdnOADjSB9IZNHQeIlUDkv4xnJSp5\nWmRYUIwwErCRpg2XjU9+iiMmBhfOmsCMgwHuEWhUCEHe0xcB8wuwbsG5DXEu\ni09tyfOE/2MtgJs5xJZVplr0SQhYbVUc0aIlhn8BXEA1LicJ2bTgUKsv2jXj\naW+WJYuVD8SZ+Y+h+X9SKOQklZzlgeFZLkk3YeXRFMMBw1LsmwxxjSO+pzUM\nV7RF2a815UGHWJzmWipScNb2kulB1KctosUgaFjPVz39TC0mynpnlIM4h929\nJq4HcDnx0pMVaqPXBADcLvfwhYnN+SkGHDFszfWMuyQYbWAxWZVFYCl/jgpm\nAe3DoTSuOZEyGBdEn5ZXHWEDvR+I9oMihscxzjnDHa5KJFHYCOL7BAZZrtDC\nPG9H\r\n=AYvT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHE6KEoIkbUShrQyEAVkY9Ohq63AeXx4KVYFrwUCJnXAAiEAobSDFlknuPTZ04nMBBt4AwSmwoj8Apv048yheynC4as="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-noselector.20190704071010_1562224316412_0.7396898711590276"},"_hasShrinkwrap":false},"0.1.13":{"name":"@atomist/org-visualizer","version":"0.1.13","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"613def93fe791758208fc902bb0eaaba40f8d3c3","_id":"@atomist/org-visualizer@0.1.13","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-ttHBb97WIMWuyvR9wxRHzZe+YE3wHwCLOWFW7DvLcqewC1mpgvSjvc7A8WJdE84aXm2XtmbnaI9nXbtiV1rQug==","shasum":"d58b810516081342e122340a47ce8c3ceb05b3db","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13.tgz","fileCount":215,"unpackedSize":2909263,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHahyCRA9TVsSAnZWagAA6v0P/2KtjcYogDcj4q1sohC4\nxAhef7MrOCaqoV5w2XF1w3ZP5G3UgTAgKXA3aSAafB8Bw2V54c+Fa4RqapUo\n+ZrqUrghp9xqJEIdRnbMMWWyTWVydd4TxxWRAsHhSI+PkI02q0M747xvD14H\nIGLnGuZeRwBAAwLF9U4s8t2eUKl7sXxzzDXwkPV1PpnuDAHEaUA5+fYlDbu6\nq58q8D5LIV+tffWcVSCSUZ0QyEOF5qk+OqlWv+hlvX6GXAmWGKxde+N35qO7\n5ekZQBSD+6Qo4HAP1clWIzbA+lheiwsgbIZlJ2eJO2YH1o5PKELxhKDDe/L4\njwfjelCVY0HD0zdsA49V4utqfadfF6Uqfi6sgHNAFWUrf8mZ68MYfiXKUbZJ\n3zPj9X6c9kPGXYx4GFbgm0ZJfy3NHxjQZw7PPDIoYi0MvA/6TlXkA3DUajyo\niS33BY37THM+fnyM5gvpja7jLK2gglOtsaB1Q84p8MrkyMmViXW3aIMX1+n0\nCVMmuuefu/08VIMIjdL0SrtriWb/CLcbRP/XYHiwrBaKVxF16LO5Hc6IQqdP\nOUhgoh19t6XaH9YkOC/x7GcOvDVHlUcocV/VG7ckHT/fAVnChqna1JQ6gY0T\noTknN/lJhaVGfZFmkGc6wEUK773HdumqD6u9vq4dpWBzHGXx6RnZbsHoopc+\nYQpg\r\n=ojrB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC2q+mqRxpM7NUNaEbLeb+9o0yuhDTkFPMq+ROiYAIFzgIgQ/SQ1IYMjwf4YoPpBuMY/jybed9Qz8TMPv03QgIA9hc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13_1562224754102_0.3291020590029077"},"_hasShrinkwrap":false},"0.1.13-noselector.20190704075322":{"name":"@atomist/org-visualizer","version":"0.1.13-noselector.20190704075322","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190702113653","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"57661366e923ff4f8e6ca10692b1c2906204e5fd","_id":"@atomist/org-visualizer@0.1.13-noselector.20190704075322","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-ieeoawfx8213MWrpdY6JOUDr9fJzWNZeQNjiJYuvITCd5DfJeDNuS1PLgIcEgFYWZuglizXNZHmibOGk8WxxBA==","shasum":"dce82511f9e881fc4c4c768dbde5c4278234fff6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.13-noselector.20190704075322.tgz","fileCount":215,"unpackedSize":2907842,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHbDvCRA9TVsSAnZWagAA2vgQAKSbs1BI9OxXZqpR8Xd2\nhT9xLtCFpvW346OUFnSs75frDjPBDrzx29NHUtOVMltXewWU8H8ETiaau0fm\n0fFv5eESLLoO8NXiXQZmgeXr0ML6YBFuTq65Bvm6lijelZLh+F+rtM3btnXd\nqRAYVDELOdTRTl2U8rD/eAf/2gN6laWsDHO+Y7iOsou4kZsT3fEfb6dmpaEs\n6xlTF7/YpVPkwQ8mJd4lyP9aDA8KYVsEH2h13Rb3yW2yuQ/XX9Y+nemoOm83\n0AjQuMkcoHbXUDbS/0ZEYJDgdKXNqKyNM4fybvSbOjLcWarePyC23b1FmMjk\nIc2iYC7XGsL07S/w5ozKUP0CDABs4yGcVWwuhJXWHwJfG541pQo+5vQDhj2E\nyCA5TK6JbXMhVMjaPYlhPpg7WrDKgArLBbGBZd6zEjHBRhv2Af+Yv8gq/wi6\nkrpusIlGSIpb74/bAfjmyWdwoPtLsLos1SbVqQWysGlqUT3odI/8Y3sw/fpF\nJElHpTtG+ei+pfdOnd1bJNr7IqsDXjB32tOcOYjuLT52zZCZDK8GdnEw5+tH\nTK7Ub6SVfEEL6BT3/5gVGbJS3fYtf792aTFbDiqxiEDHXp/sKwT8OPyncaKX\nIEJJbX9kpGcKFW7A6UpIFWynuhg0GfwTsFmaXXN0dcX63z5GmRL+KumBOzhW\nNg/U\r\n=7ki3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHhEOPo3uazS8PROBqHldeCr3JQvguzYoEGmbBFVBBN5AiEA0E3WF8f4+FuRFEX55ooqxOk3XDoArGzzoqjzOvbGCHc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.13-noselector.20190704075322_1562226926007_0.07289640492211524"},"_hasShrinkwrap":false},"0.1.14-master.20190704105607":{"name":"@atomist/org-visualizer","version":"0.1.14-master.20190704105607","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190704104454","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"91906f08c2a01778974a4bf19c1184a14da53f7c","_id":"@atomist/org-visualizer@0.1.14-master.20190704105607","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-j2hCqkQh1l29/qK7ZAQ0yck0SmwpLHfxR8eMylb1VEaB7saWwi3zZBeDfzCNNjupW4TJuEHJa10VKq8QdkpiEg==","shasum":"a19b4996a4c509ff81705934c6828dcbfed482dd","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.14-master.20190704105607.tgz","fileCount":215,"unpackedSize":2909859,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHdu7CRA9TVsSAnZWagAAzMcP/3Gg+PrPYn7HKuABWQX8\n2T2i1U5E9/R15kXm1s80NnhxumddgEFBr6D/WwOpiLqz57WyrpK68GDIkFJ4\nk4B/2/ZbKdQ2gukey1SajUWX88hbA1Cq4V/KUtbD3bZq0HfdhxbYBDtWpJs7\nFfjATvIU+5iuWgpsf4/eHJfyRCueA8sS55b0D6PAFdkcwRJblGf7gguxNJ0P\nU3Nwdjek9tmpiOBHtYscEKiFhD0DOCe9sheoN5kJGFPll28DzR9rzOyGBlGz\nCKUQjX+Oj4EBFYJ1YaXlf66bjd8oO/+/6QFm+tX4kVyuFqi2BMfoTz9debYk\nwrFCHQolL8mw96IRQ+ul4n5QWJk0BBlJBc240XUQNT/DirU5/uFbqq8vpqgw\nbQo7HTkE0MEJ7JSswD0oLq2zjn0i7VN3bs3GD2gJx+uCTt3vyxjQsKft2XuX\n1P5lx1ZY9fCVWEwQEtZtrYMUREjpqw4HBnHLS8J1Uy+9y+0FMeRzuBeEN8NY\n8i3Kehx3HPJdvXEreQ557I/sCJ6C7/zWsX37iLKhQWms83dEOr2dEAR1kXol\nIlf9MgVTo8iVGLxf0AOdTO4BbCARRjv01RNiZk1P0z/XzeBQEvrW2b1M/Uk+\nmvSd6FiS32+CKoWOYwv1jexGvEgDReWWp9Vo/zmnm5y9ls3ba4HtwjBCctRl\nZmXi\r\n=fCu6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICqqLnus+Ea2VLiU1rkQv7Hofkcx4wJyO0Tzef95lbtlAiBWE/X6lSrQGmBZjRYUHOujfGWmyt2s7Y4cWo/++PCJ6Q=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.14-master.20190704105607_1562237882430_0.36561963428855315"},"_hasShrinkwrap":false},"0.1.14":{"name":"@atomist/org-visualizer","version":"0.1.14","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190704104454","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"a64e52796e94b43616a07d3c2da8acbe61e0d3d2","_id":"@atomist/org-visualizer@0.1.14","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-YYjn+PSmthwQraXIbZJu3o7PnaJ5KW65Bz82auWRP6FvOUy3ny4+a/a19xL+7/PEWpbsg/fYT/vEiAhNvjTqUA==","shasum":"de3ba2032b6fbf5ffeaff4fc463fc8f5ce1ab5be","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.14.tgz","fileCount":215,"unpackedSize":2909837,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHdyqCRA9TVsSAnZWagAABLYP/jONV8mmgTs/Nb+hd4gu\nh9Wo8G4ruqjI8OvZaxzrJNxbZBceVlTxt6mnJVnINeI7MKJG7e70oEJ8s8Ix\nYOQgaPqGGr4Oj+xZfkMJIJOpPHHpmdcdvtf00cd0PfL5l+YD0Gq7oV4N/4T8\nKSffiSO/Em6h3wxKPAYrLmcEyNfycgSHyJMOk6bCoIYt1Bqswiqu+6W7HTtv\n5GahJzNHpgiIlxpljgaWkzpa0EaXgXVGybFp1sksqpa0tDAYWJbDMtnoVMgb\n41nCtsIP9mmIiXHBoBbiUd+n62g3apJ8K/tGY8Dvgq1ti81FmEi8R65yGksJ\nmD20R0Kzh5Y7MmaekdA+SVVPaK+AvYhPKnuHuM1Hb0hnLx9i5raBmRcPgA/x\nrxq+vTZnmBNiuzz1YeqVjAqHFgyOewGMPz/Lj6PN+xH8Ikg6v89eH/KQVGSj\nUDX/EHuLfci+05EpVUIidAf+fX7JvUfW8XrsuNdYZXQbpf7eM5VCNNA1r/ii\nmQAnlbl/vPzote76Via8YMSU81xTNHWCBGEZWJPniJxPSetgbBKUtjzaT3qz\nFdcXka6VS0ozX7Q5I70DGfOqA5MI5Q+sK84MJhPtDjq83aiPOLxdFoyOE3g8\nnXoY1bPXd0GW8/+LI1TsG4ixkkwdu0OvshiJllGqY9zK+hX+/yiC9Hlhy27q\nT/fL\r\n=YiNo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFAg6j3sIzzVzSWv/7aZMPvnYq6O0wP8ZCD3umaDWRL0AiAnJv2uNrLdlR9Ps1RYLRZitYHDQgQugvQBscwOqGPp9w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.14_1562238121790_0.22688052590454189"},"_hasShrinkwrap":false},"0.1.15-master.20190704121806":{"name":"@atomist/org-visualizer","version":"0.1.15-master.20190704121806","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190704120909","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1b036808b904e59999f6a99467a05bf2dc4d3929","_id":"@atomist/org-visualizer@0.1.15-master.20190704121806","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-M+KOE++eLeu/xLtf/Nk/CmSURnmbtmBO1a/WuKnPHtFPAmS4r4zPNxUTNMlCSRB4G+7HPEJioj/GdNfy31Bseg==","shasum":"6d454689f4f73cc9e5adaf415b6c9cfd5fda90f1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.15-master.20190704121806.tgz","fileCount":215,"unpackedSize":2909953,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHe9JCRA9TVsSAnZWagAAeOoP/3xurqD76VmPgg5wKKxF\ntGbkvZrrJqyclz4MShyeN5wOFepzu4HD2P6T+Zvrs2Bq7rwcAP5wdeO8CS0Z\nB98Jm+msCj143imWZ8ekVuyqY4YNzijxtmuO+QrbduxC+6yG247N8+DVULy0\nvGefYmmPT6vBFlJfW1WMkDfq2s6ZtUyY7IPCsxLlLvstvAgUdDuHye4mfSfS\n7B/CJw7EjLbJzmRZ3UhdFlTHbSMalWFcoduM+aWZZWHHC78zXof9DNEr9biC\njWAHGLbp/bQzhMblGNdicx6bwEVdzzRdx9jemEBXMYanGvr21NCXBgQkdOmZ\ns0Zsi8Kng2g73DjuQCVUPMwyNrf18wbj4nP2mKQV3PSqJZRflDPgWiVVw5I0\ncFvN2aLxjtBTHnSKdLmdP5T6BmhJJeRGA9Fl2rh6LOqbKTqgg66Q8DuZydQw\nR0dUEfPJzzDth8IXTuzORYg/dOYB3E7UPMQV/kd6RkK1azqysd5k8g9KIVDV\nNGUzgPYkZ0QpyZysEcJv78W1sMPuU82JirHGoxLrRhX8G1AncU/RzmccDpFd\nIyGSnK6jF3jIcznzRLtaNtpNJU0NX8bpAxa4Fk9YHD27rOa2Lho9yplRvWnw\nbpcL6Jlr87YWQRNFyyCyIZfsSyhVlWfpbDgCXUMkHnOsG1+rOGod/4J2LVI4\nt8xr\r\n=D7HK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3pJVePm5uKxzeKgQPFB9uGysHG+Y89/DvR1dsW5B2GgIgb8jaKxjc1YA0mSTT8W2NRJf9pDvdz/gBTDNywZa2ssI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.15-master.20190704121806_1562242888856_0.2920158446716805"},"_hasShrinkwrap":false},"0.1.15":{"name":"@atomist/org-visualizer","version":"0.1.15","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.0-master.20190704120909","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"327bde51b242c503cd67445563fd97723d7d014c","_id":"@atomist/org-visualizer@0.1.15","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Yc5hPjdRD5RdllXpRRl8c58RiwUXcpqggvwL967jX+m2KQymujG55rMtleNP/HKBGPiYLseq0eqfsYKlfA8Pzg==","shasum":"de7b57bfac578b3ef91ec897eb21ccd9f785a0ea","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.15.tgz","fileCount":215,"unpackedSize":2909931,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHfS9CRA9TVsSAnZWagAAiCAP/iFYWmkAmholItJYPslr\ng4mWlKXzraaTAdaYem9T8zzQOGKkGgwX0Kq4dteltHrwJb1CbPzEnuHG3axj\ntE15HYUUouf5w6m16NKk9tl/GSRoHR87aQyUDgwhYuClt3aJB9JLpM25puJU\nbAJwbgQLGAlMpAyAzpZqiOOPOe3fdiBAayibU8enltuIiWbmIvBFukAwj+s+\nL/UwTK/XPv3dCkdRYofkHKNKk6y/LVjs6L5VkC9DXosQJ17+B/nLEiDPg1Jt\nNm3Hm+dy0AZvhZnCJNPGYKZwdafjcPS1vqWeOL+eFOJ7EwmMbOo9p9ocxOuY\nKGc7YTtqNht/77RPcOqCSBVOvPwsGy+RH2kjxZ7edi9rEY086mb9Unmd4Rc+\nneiCl7RWcZxSHl/10B68xFueWzByGe7ed93i2cI7oRObAfRQdrpmYpqa+Oqu\n0HZ04H83sUnMKvHCxduQhq+9yJTa+BlkN8JJnounD2vWMAf2nNQcjssWeAPE\nOIfD6YqtAAopelLTm2iMVrJG5iJwJ9Oy/jdItcUNCcBugjK85mmjUOZuzQBt\neaJ7BfJU9R6hG2JgYsGFhuvMif6VgFCxEI5BDioF8/UhyR7IEK0dneFI1vei\npaeRnK4eIfGSuESqiKaOBM1RJNBJl8QNasWW18Fm1+v/yDnYQLfZ+tHaD7UB\nX6Xs\r\n=ZjKs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJYXIzG9UjqVCjwGm37bB4MRgqmHnZ7MJBpuHiyaWfZAIgRwGyxDm1mtDjMmB9u1q4HM+iPNMRNsC04SZ+MA1L5sM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.15_1562244284289_0.006868712480530226"},"_hasShrinkwrap":false},"0.1.16-master.20190704193642":{"name":"@atomist/org-visualizer","version":"0.1.16-master.20190704193642","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b7a84387ac978b4e398f95057b3e07247f700360","_id":"@atomist/org-visualizer@0.1.16-master.20190704193642","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-ARfu8vUwHVekQavTkAUf2OewE8UlRWIdYB5k+ylogHf6tPE44Bcp/9or4qbmgNakk4v0R+LKQgoHuuD4w/E65w==","shasum":"3c2dc11130378d516a46fe96aaa53452850ccd03","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.16-master.20190704193642.tgz","fileCount":215,"unpackedSize":2910651,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHlW6CRA9TVsSAnZWagAAYiMP+QA2yry3e5jC4pOyiugU\nB9VlGDdUrBn4PAQFNk5OHpi+ao7FGCL29coFVMwySmIt2gP0u/44ZoPjI1Ip\nhhk8UZPbwvEYS8iS/znQ7lw0gOiGrIb/+S9BnVRvmRzVp4GlR3kEpzuWfqCj\nF06rRAvNawZq3Zr2Fiym89Zdx8auSyKoMmiXgUx0hZmUwBHvY9YrNfPY/TTv\nN9Z3GffWGzYV7/hWSyiJEBIf0YXthiN7e6HgskAx/52uA5eUM3uEBX6YqbWG\nBQsYZUS8DPZOMxystCqiSFfRKmEwYEks9DhkKgftnxt3oVn8AcITwqoemCxN\n2X+qJJlfTiW+sUuKAw3ql1cg2YSlyKKylL2uFQDcE2JuIXK1+2cUAMAMvutO\nGMASeyd3dlwY5SCnc54OB4X8mo5LhzGrh+w0r3uZCVN7vrdZed1QFw0vw8YY\nXddpqF2oqpHSlKpn6Z1Z5Uq8kmf8XtlWipwdPg4t0U/QTCZl33K3YZKOi1qH\n/dJV3ZXZE53RNoSCXlJ2by2NQX5Ge7n0oYPa1y2BeYp9r/3ARaWn9yfrd9es\n1O8mrTkQh0b9N1aebIP8o18JF3sLawiwCARWYbrNY495bFv2v97jLo8rXJZ/\nTTugyEfyDI7sQQcw0+19AIZHJNbyerUqCGhACidWbjAAG5x2FMOPzJrCnNTt\nZtRL\r\n=jFU9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCVsawNkU13dKZs78D9avrARc9ytzAMBiCnlOvlYHdbgAIhAKK9aNyPpJ7/mOp3BfM18ylQ3spvf/5LxCYmoeSo3+UT"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.16-master.20190704193642_1562269113275_0.5552791778063397"},"_hasShrinkwrap":false},"0.1.16-master.20190704193725":{"name":"@atomist/org-visualizer","version":"0.1.16-master.20190704193725","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4-file-feature.20190701215847","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b7a84387ac978b4e398f95057b3e07247f700360","_id":"@atomist/org-visualizer@0.1.16-master.20190704193725","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Jsl6pq4vvO3v9i4VjFV7rtELFHKow3cSQNn00UAcKOnceMXyQitaqLawR//x7kaxZCEDsfpkUfj/rnT8iQ/lVw==","shasum":"129826d83d8687a2247050fd16e6de3f2c898f44","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.16-master.20190704193725.tgz","fileCount":215,"unpackedSize":2910651,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHlXuCRA9TVsSAnZWagAAhrIP/2dKD44PlXKr8+P/fcXX\n0nPQhjiz0F5966jW2LOhca74mPdz//Q9wrQVfczHr7RNXjzC3VVkw6wq6r/G\nrGvoLYaOZlhsuRY+ckZUML7VfBP5+TlOsNRMZeRSQlIAUrVIO4Y9goDHBDp0\nz1ci0kTR/rTMHd5JxMg1NawJfbPSymPuH82d7bsr5JYpLVlRcEsJMQYCLOJi\n12WUjAZLNQ0lF1XVeRQxWaq6/OpLrZrNKrk5/3TJwocwk8fQ8439jN2cPKA0\noni+CSPHnTzZWpqbtEdmMmXW4RucJ7f7bRGxyW9pGyg3KOpE7iMcn0DC4tl6\nF830KTUyPs8kaSlDYDpTX8MG5Mtx2XlqyPfQbw1JAXC6ZinwCxPNJGSNPt1T\nKX0FBsV/yWW/ylNYkozGDNHaKfbbeK0jDofhP9RmzspPiWg+sVGES1jtv5SF\nyjxvI9Mth7wbTAHl5CWuGHrySSzG4Tm9x7Q4FZGxNcy+H3O3sXhcfw1gBGgx\nrjuvAzY7YmOI03eMeNCOOtk05g/AW3Eclrrd/QE0UIxEBkcRynRDGxk+s6hv\n4afTSkeScpixlUebPKFJTUqNK248w7eMsNzlQPxoy60ctQ1GwOmR+rfSz7xn\n3s84YDMlQXC4Cv+byZN/E9YNHukePUJYjhrdxq5s+xwYGdNd7NOlAkrtoMuJ\nuFvF\r\n=pgBM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDa9WMcFBKvr4mgjJkH+OJUFZSWGSzrZV5fqQpIeD2G9wIgHfcxNp5GuYkO2DzduOm5mII3jL1f8dU4l+7OZCqP/38="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.16-master.20190704193725_1562269165815_0.5180871181818694"},"_hasShrinkwrap":false},"0.1.16-master.20190704195009":{"name":"@atomist/org-visualizer","version":"0.1.16-master.20190704195009","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1d980d6b51780aa872b026434cd36f2bef4989d5","_id":"@atomist/org-visualizer@0.1.16-master.20190704195009","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Kg0aQjFli//MXMgRjLAmytxxuygZXDzH7BTrwr8xcY56+Oj/XjtTepRLqQVGoK67KAKeIHxw0fHHxktL7ask3g==","shasum":"e51cd6d87e9b78400868b700d16c2d6480d92ad4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.16-master.20190704195009.tgz","fileCount":215,"unpackedSize":2909194,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHlmBCRA9TVsSAnZWagAAOj4P+wfGJFXFX4MEyfdIgdvZ\n4dmgmEpYagJyGKZKQX7jeQsIDbwdBlCpWkCKiLcM5WnbZYObWuOBJpL2llHC\n2iuFvVyBJtxw+A7o0V1NwIV8y42D6x7mvpvLeA4U02+GWHkLhWJVL4pD8dhb\naGWHhZlr5g0q0ZSm7bla31e362/rQzmGvR9aB2FyxsChySQ8/lOBFoWgW4O9\nv2DLx0YJBVjgSSWwJU7VaVD6fXVGkMaKa0N0ZhX3XGAqlFjyiybVYDE5k5EH\nfiUdmJBbHqyPPwxJTdSM38PQS/kNFfNOqXK00oy/TSDC56Kxe885LnNp4/sI\nzGmZsvpKIP9nAezpyzOzRYaw/H+S2IRII4xU+ontHOdcBPiSX62xaAQoaoXz\n0SMQw1wi4qNiVTpCATsq1ebXUUbzTAmlXTLeE4hiFKrPGdBp/o8R1SCzQZC/\nlhCYbn7TwutDPxdr0lmt40jnMawdmV9c3XUWWlvCfFbFXjQuuSgkiWak2C54\nwNA7nOZsCM+sNuaKM/Sh+j4pfP/R613qPB+Uv2sG0V5lkKmvq5EjEEgE8HvY\ng7SVtVTuCCGRxJrSaLWmCDIA2rYUWSS6FzprZj9bYSOtjBpu1kYWP270T9Nj\najkpK+ILhFbK89+obhcbNyE1YwToKdR8OlEKrK4SdPPnfqDMDfORVruahL7K\nInKF\r\n=0NdE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFytNJBoR++KOfY2QF+eq+xFeO+UZzmyoJ64GLQdkSJSAiEA+qlfHdestEKkN4QGjFMOBlXlGjYXDPg7Gp+1ok6pAIg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.16-master.20190704195009_1562270080601_0.11186315433946792"},"_hasShrinkwrap":false},"0.1.16-master.20190704195442":{"name":"@atomist/org-visualizer","version":"0.1.16-master.20190704195442","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_wiz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"af32502c9bad37da4add74152dfa0028ad0df609","_id":"@atomist/org-visualizer@0.1.16-master.20190704195442","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-s5rdAnQL+zc2tBfF8/XIyiasE2N4OpMhg0m2gzMv19L3oSTg3YfyNRbD+cL+JkuMZWQbQZtudtuDnpwEKcRiLg==","shasum":"40f73cb6057822d305ba8fa9d80069d9a2a6dde6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.16-master.20190704195442.tgz","fileCount":215,"unpackedSize":2909166,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHlonCRA9TVsSAnZWagAAdrkP/0fLWbjRZeLHNAIRosmq\n6oeeNEBz/WkedkUuB0fqh6yKknGVWIDMiRrQtOiP2tzERqRMkucAA7mi+8VG\nfjZgmgfXki0stggHyKNqi3saKMBRt77TNOvlgY2NzrLfnLa86dDExLxRoDkG\nMdDPLNWsPrq0ItbMur6a28hvW79WV3stCScreUPh/ozlHOPibdjpOJROwEe9\naLzkOJxNkLjGNBJTKnNJOxJGgTZQz8t6zIxHlVk2poSpA2jV7GVdTBM37+un\nSIAEK8yS4wAYFC6DTTFycw8jpgaP6XnqiN2+av8R6aUZgajEbsYSHHahiFOm\nxNLUDvfkRq84O/h6HOt64KHhWa6z2AujQhPw3kQQwEGVmVjVqwygM8fLXLHt\nDr/g34hd6qXoa+h+U7heQVSCLNPrJdF42SuaFwo5YwrRtoTsknn+Z3MZzveg\nifUJFMA8K1MHncB4TlAAUlSuMNUc14WHMqRoEt/TImY5I6pZL8SfOusNFIaw\neCdXe2uosld1hLoSnlkjmbhh9Hvf4h2AXCYen512VqJuELzx7Ucrd0fPgM+r\nOWOuTc3dM0zwcFGxfCESYgCiGrrEdEf0fduBotVwXK+R6sZUO3v7BA9RMAGT\nHojG6EgD5PAnpzGXrSNISSeowGhSQje7IWhVewUg0tLVi1WvnxXUtCKuBWmj\nNRPw\r\n=cF2x\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGVQ1yz7tp3siiT3/dSOQhQncoDSLlgLxZTmcwiyYmyBAiEAojeAZr4977ZwUjacNss+IuScKjxfl4ZVW6VatiXsNEg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.16-master.20190704195442_1562270247215_0.9466087941195798"},"_hasShrinkwrap":false},"0.1.16-master.20190705081207":{"name":"@atomist/org-visualizer","version":"0.1.16-master.20190705081207","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"576a2a102c22ebecd9f3bd4ef402ca4fd3048840","_id":"@atomist/org-visualizer@0.1.16-master.20190705081207","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-/8h4X4cQRiqLTs1/H8sP9Nu9QpWxGJlt156gcVLSdBeKeIhiDu2Y5vx4/lN4wyCqQ26tfvsbLJz/J6cYstY8NQ==","shasum":"98dbf42118dd224d1f94c8f6d2f12720aeb82dca","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.16-master.20190705081207.tgz","fileCount":215,"unpackedSize":2910154,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHwdECRA9TVsSAnZWagAAu0MP/iaU4Tq+iGeDN9Kw/HOI\ny8B82iXv9NDoWNDI2fQQadpXzLesl/Rs4ZuBDo5iHtEecs2RJtOmE5qETRA2\ndsG3xjz00rEIlX4bCRdSZi4lZ+yOLv+8TglHDFABseksFQuNrNSngQM72O1M\nz/VrjOTvlSju0ndTa++sy8K5yXSfXe4/jJuSv7twmSFVi7IDyLRO1ANTqo/W\nfRpyV+iWC7WFlU5frs0uwzuQSfLx3Scc9zR/FRM65W8iOWsOghjFi46EDJ8A\nFFq7uqYNfYtYrCVb86SHGDalIUAcIcSp0wU7Ak6drjb3clH7sQ2++k25EGri\npGFzJJ1B8QQMGzV1Ob2wrdjsbSiJftwc/6n3Bzx4ZBer2+NQ8Av6iKXmikDZ\nG5Foh2nR0VX3GKpIk862HRijUQpgXLMTq/B8VMshEE/AXy1Xif37+6VXzxb6\n6WicNvfX4tWaLHu5DHqc60KPSXVCT2AxxDp2xSH0a2fp1uE0ow7WnbkcywLL\nl4Iw00Ru3/dzRxFmzzDQtOx2wclCQzIgacdFUvkPuGaN2eYU+AFp6zgaDbFA\nQ/D3Bos4zcsd81SrIhIgxZu6VkQNomXDp21LUrvnC58GGDs7ungqB+kX3MML\ntBIZEydxADh53G5i7Jhhj/iftgItKvdPqlwuaSVMewB1+JjUFlJPtewIuCeb\nHBLl\r\n=Bvv6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDfL4Mc+iZ1uf1tfFBpfC6Pk8EekG7GKxybVKg1teqldwIhAOgKH1ahjSjQvKmV9suGRwxQ6c5Vyu3Z6HnYcLKRu2rf"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.16-master.20190705081207_1562314563854_0.7811055573758738"},"_hasShrinkwrap":false},"0.1.16-master.20190705081512":{"name":"@atomist/org-visualizer","version":"0.1.16-master.20190705081512","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190703204409","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"51a25ef23fbb783f935e505d6b92e39e1517af5c","_id":"@atomist/org-visualizer@0.1.16-master.20190705081512","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-LV+dmvt36t4fzJb0I+Ch12e94ztwh6rgYMcl319ijP58j1JAjIAntoqLSv08SDJZOVZ7L+7U4qDjTQTeZhtdzA==","shasum":"fd84734e7cb75c92220c9cee4811f0ba4446ee2f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.16-master.20190705081512.tgz","fileCount":215,"unpackedSize":2910154,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHweICRA9TVsSAnZWagAAxL0QAIKzzNjok9++SiLhuGI7\ns1eoS6ok4Rh+NDQivjm/o8mns6Lfp25kSvz+Gqvvq30hEDDwa+zEskR9nM1N\nd4IiEqsE2Avo3IZWgyAxbunKeQ7w9cGCJ7CmfXW8cpeVPrdXfKt+IaW6UkBv\nn5BG6X+9Rm+63WqUFZmA3kEuT0p0beYkMw/PW28spACbUTyiELeTLisoOXbt\nM3FZSySFHaC2osvBj65UBk6fyNvtYvaSnsq9jiJ0ZEQbvXu82T4iVjTFf6oO\nHSHUuSmHo28OTt0MlkHXg7Ah5+eZHAfc/TaWWq3JQpqeTVaA+R9je9uagDv3\nyyG180h9koxo7LlwmOsyBcyblG3/ZobMv/UAIkm9taLeBD+N2D22yTuc99fX\nypwXN1AOSXED9lR9LQHTkeOYtU01BRzX2mrmYdbQaPM23SEXGfPWrr5tIChA\nv07ZqkL3ycRxmqSn7fkTax7HfDcWDCkUyp1Y2LfVI0IIPZ9bfL4CY3wz41B1\nYU9DWbtlJaV9C3vZKqn4qm0KcZh9DEoaTfox7HtA/Dm7LeN1B7KuAX9fvECD\nRugERbiDq+2tr8VaAdnlCSqUnEBQquTi2o38GqCVhBVT4qHM11I50jnShL3w\nZ6WysZPKxyATGdxoM0/Zori7AU8poRpJX9zNlos0jKLJvMVgbXsyGow2JF3J\nRHAm\r\n=xi8R\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJHXwGkxl99Bh0dXvKDXY2Z2xfHALZCFLJmMhWiSfc6wIgBD56njwM4V2vhrQcEQH9+NLJk1kYW7kH3NqUlJyKRL8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.16-master.20190705081512_1562314631960_0.15347418471322016"},"_hasShrinkwrap":false},"0.1.16-master.20190705092155":{"name":"@atomist/org-visualizer","version":"0.1.16-master.20190705092155","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e9311b087115a767e3ff5fb97715d93a0ac8f465","_id":"@atomist/org-visualizer@0.1.16-master.20190705092155","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-23tJmuXuGX3/Mxmgwj0jD/O6HH/HUJdPIB7TAPMpvmX8g23dMPMoUxx8jYa2nO1LNUp+wJ0OSsPwyFxFxc2/RA==","shasum":"8ef8aeeb9629b433f0d76389911b93bec28c3e04","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.16-master.20190705092155.tgz","fileCount":215,"unpackedSize":2910046,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHxd0CRA9TVsSAnZWagAADSAP/Rq2ox5JgzT/ZXKC7ayQ\n5bN4zgDt742vOgQr4BfWutnnO/bANWAJgTSaCIg8lg5qpuQrzJ/6jZL/NfQN\nUdvKXdOmV5M3lP8vgXdcrUq7ASkfrGOhDjLjR/zAtUazeKuUwPQXwe2deJVF\nogr7tLLTKHjHfPVuLGN8cmrLRt3ySkiDiqcupkgqFqwEIl9YrPcNhzzXZeNk\nxH5ujQ4rvJFRPHUFYmb42TgvkpCiIj8F45zO/q/PYgnEqy8XVUQ523K4jGJZ\nxC8CPkowNo5jNejM3Cm78oMfPnuFgHtJHhSpXhhqztz7H5HAKy24exba1AUO\nUmxH5j/n+cu2YA1aoNrsjqAIf2R7FOtciWNqpHJhlO+VAS+FX+I32rV9hvwD\nRurTVGkf9SqxPZTlqH+5bqDToPGFNVmjcbIT8f5O8DyqiWdPWTCVDsyzQvGq\nGM3lc1IUiOV4dl2ZPHCKdgNPt+dnei6SsLvxBKzPoF7wMIC3iGy7Oluq4V6u\nAtE1HSnGarsc/OG9UsT8i9iLt8tx1gDPrKP2qDR3c6+o4Me0eUnn+WzajZjr\n8fgf+8V06/brshrnkxS6yKho0kJcQnpWTkI1MnrDpnbbTxK7aut938nqNU1Q\niLRvrojL1TmNTxZttiyOwBvXNX/GXxG9uuvGbJErqEw91WfzpxL+9FUtoAk0\nbcmx\r\n=BdJc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC9QoQMc8faqDgvVOns4C6Zq2QVkBD4qXzqqRGDlklAOAiBPgvxR8kp8LgIzwfPkvncJrej7diEhQ3/9f4kZJQ5t6A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.16-master.20190705092155_1562318707984_0.9216273089226992"},"_hasShrinkwrap":false},"0.1.16-master.20190705093112":{"name":"@atomist/org-visualizer","version":"0.1.16-master.20190705093112","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4dae54e32e3c3f90917c4f1afc0c7b882441e0b2","_id":"@atomist/org-visualizer@0.1.16-master.20190705093112","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-2fcnTlprBSJITZJ7O+Li7QxXtV4oKlYONkJR7FcE5gJUFyi5oqlaXWZy4I/OQ+spnH9Gfd76iqsYK1MHwqNgUQ==","shasum":"045997a77203f9f8ee9f59999cfff815a5649be7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.16-master.20190705093112.tgz","fileCount":215,"unpackedSize":2909997,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHxlICRA9TVsSAnZWagAADVEP/1+6+/mGR/T9oZkCO5G6\nuUuSk+yNQUfE1wbg407qh8bWQ996SyWE6Ikr1Bq+usFV1lk43j2agnVq6DHE\nhQRkVl6njgZFhB3jpvl15295Bpr/5nwi8H243J2fko1NL4IkjlcE9/qlM+zT\n/4rhCq854oAYRwmfsvcoV6b4PT+N1fjVm8mKMpnPkmhivRNG4J7LZlLl2JL8\nSOMZppNGoSfS+BurPZ0Q5DqA5MH5yIq6+nxm/3KbK9tftVRfwDUE3Q46tL8E\n7f5/d52feWxCHOH5J2IusgRUH8G1KAYWlFhaastQQXNM13bG9ld5pGbEV5cp\nTdHyDrQjQAmBLg5vsuQ2Z0xkAe6u0ffbU5wKx7dpDL7VZU2raM1Oo1LdyZI1\n0Fly9MB/xuZIOIOWXkNoLDzIPnXfaezs+NypcLvvQ6j75WL9gYvyNlLduYoP\njHKicNtH4SYL44vBT9p0MFQeEuAW4O+SW+l3EYPpjC03C412Csaryuh9tApM\njt2Pqy/H0ACpON1ku4ZZnMuV5CpcUtMlXqb4/OrfaoP4+7P5hcDBszEw0eDu\nbbhfhYYEzUo9iPDUShqss34+2srq5uBqr/dkSdJO1hqPqbNZoVA+VE4xa+Pv\nCmZWgDPcZ4QuUlhGkoL17jBYzxYblIECRMiXN/vSWEZ0czX9JiTO42kDHfyx\nyAbg\r\n=LpMK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDrKZ+nv/HFnXVdRkXe56vUEGXaWwFyP+BHTyt3DLIeAQIhAPOlUWs3QWPKxiIMksf4CWlBGeC8n1Vljqex1RbikKnl"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.16-master.20190705093112_1562319175567_0.5456211656827383"},"_hasShrinkwrap":false},"0.1.16":{"name":"@atomist/org-visualizer","version":"0.1.16","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"28022855e6ac7a84f48e0c0f78f89bc40099e860","_id":"@atomist/org-visualizer@0.1.16","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Jrgoz/yJDGPxjFhcykS/7Uu3/9EMYDyM5q0h9vK51pfJz+f8w0hKu+Hf6nwFkyLaEEjC5WIOaq08aU2bccV23A==","shasum":"80ffc36e734bd211fa338ca6718be04f50d454bf","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.16.tgz","fileCount":215,"unpackedSize":2909975,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHx2tCRA9TVsSAnZWagAAbFQP/2wVzOy9zWpeTL7shw12\nRQ7ufsU4sd04h6EliIISOFR300z6qCm8PnLtgfifrAucLvB/CvvgIVKEyUVm\nJJkuKb5/xh6SDvqi4rD2Sc6A6RQIeYFqEotBQ1+fICDYeL/qTb/0GqmS5f+w\nOCo+B3mLn/6qRv7EKV6KXN/13OjsUB3Ckko9rwFzF+jE8Mc7i1GtHoVS4/J1\nN/3xDByLGe/bbCEJ3Ns4P1Zr2Gjg3+LSbLmEC85/GCcikMkblt2u5ul7de1b\nuX75S0D1UHch6PE6F30UM/iF3JAMlSeTWFZMs/WcdVuV2D7D5e3enk6MkFTH\nmEJQ3ic8nPoo96uMGaPW3e97LZxZ+njfdMd1dPBMCOQmYfTyfYAcy0NHcu36\nFhxjQHnwphrDVAmocXMcBx/tSN2lGSSuocDR+sLgejVFEuZudkXgjipgt1dW\nZYCL9RTPTifhkm1CddteNXAByF2RHHAJ3gVYy2Kpqqele945km3M0sOblnD7\nSCoOL40mAHr1cjfzLs18Mta1Fo2vQC4VM1rF/X+CMWbJWZO5hKJlIKiq9Mt6\nnaDw0Biwmw0wfy4U5e/QNBwRd4E+Dmot76Hnb3znUqtUjKQohfCOp9c4Kw2q\ndEaA1Z+TBL5eP2vmsDhhXnGjmJUtx06u7U+hQSaCSBRPJCZRfIgs2KxG8Ft0\nGoeo\r\n=6+en\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTeTPVQj/ETm0zDgFSUBBGaZkf1QA+uNMWsrOLZmBsZQIhAOYxPWvbZTFKAw9ba6fe7zzuZX1sENi6FweV0vu5SvSB"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.16_1562320300580_0.41471871659275883"},"_hasShrinkwrap":false},"0.1.17-master.20190705225954":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190705225954","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ec050542aeed3ceb67adb2de906ce3b99f9eb17c","_id":"@atomist/org-visualizer@0.1.17-master.20190705225954","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-q1tafCcs13GIgpuhgnAQkRe2TIReDdfKSJaKU+u0s9IttMXBjCxy/HACWyRlRqGvt/RhmM105z/BhSC2pUaoOg==","shasum":"9ff5afe64d4bfe6ae5cad7b524eeaca0cb072552","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190705225954.tgz","fileCount":215,"unpackedSize":2912928,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdH9cOCRA9TVsSAnZWagAAC1AP/2XRGGLrHO363+CDHkTu\nqDVnqJw85yOOHTu3MK9FZoqHJDhi3MCthLY5/qIL9x+z9WmoBP32JmYY3Ax9\nHukM6Zas1L7LuysakG+IHffx7MHVsrwMwV7+jdIiARV4c0moV4fiQR2sGwF5\nbp4QHWuF4pFvs2A0WAPxT9+nX3p6JBhTX1bvjApbiA0v211jVnhG4BPf3HRU\nV4Y++lycrQTIxqkDOSkwtJnJFj2dyyfAqgY9EdvFlcD/s9ikjhc0OxrdYBb0\nlo0+BONYaXN6EyRKrEeDUWrf5ViY1H6FvFwoY+2plO+z66e6vN6T8EvdZm2c\nu0NUEhmX5kfrr7dSglXiWpC6azN3oUzRNth2fS2SlRkr0F5hP3e4XTgU1l4o\nzU+Vu0EAYEBgVTHD3kL1dLcM5NPY3Knvjc3zBiBKGtYDeCIzgrpzlYOlZFJ2\nTDj807RJZYI7cGc2ecQzUMYe+plv5rswpXs0Evo5OhB5DoNrL7i3LcfnPuGZ\n7CCsOT6tmn4PzNn0Uwh59amduk3PT8PryJhzTYVWXIIiKzYE7w+jR7l+NUdJ\nDKdv91TtL/3rZnndDv1lwC70rGNUVpcZtXJhEWCx9EMUdIpvB7V/Dh9tjw96\nPbWWoa+M9IjXejKlrPrY3aW2b3WkKuA8BhVPy4U6JynVCENZvdTgMCNO0IPO\ndMvD\r\n=9YNS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCIwQIhIL9pCjVCEMqB8CoHAZ/qfda0cn6IaH8f/CuMIQIhAJEsnsabMBwuKGsugUCV3U4BawWsmSoVDXXlY8BvH4S3"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190705225954_1562367756926_0.9271774499530057"},"_hasShrinkwrap":false},"0.1.17-master.20190706090217":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190706090217","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f91b19449c0168d46f3525849358f5f590206c9c","_id":"@atomist/org-visualizer@0.1.17-master.20190706090217","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-1rP6/cAcCkD0CNtJcu51KZqd6BsThgvhfKW9o+B476rstAbuOPqnMkb6vQj5dy2YTUwv1HXgp2ZvEgJFTkke8w==","shasum":"f8fcfe49b20ca31f5f47eefe3f805e1e3bece4d8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190706090217.tgz","fileCount":215,"unpackedSize":2917921,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIGQJCRA9TVsSAnZWagAAFRkP/j1S9mMkLdCEDfzp2rEO\nFt7F62F/qxs3zj4hQEcBw78b9H27BqP1PpkAKTyTORvz6OvLrUlI4mdCmY8+\noNSIhJyZan3EQ+zk600TQgu9xr38NVI91T/0OavLOL6dnjUvSAehmB65Xxe5\nE3Fju1rjSz8ukntMZ+3eMT0VQxn/guEeSxY/0wCV9DarDHBXDAJ6cq2Kr2HI\nL/hrojxanWTtdaJ9VncL4GZZril4YFpbsxgZcYnHvmW/XN4qUXdXbYIl1oWH\n58kbsP50TG0zq7goulvSWmMorKAr+L2K6GJDwqcr2d+PPTMEntHBbLkp0XPg\nzqNH16kHRut/LdP8G3yCwCYeiOp5Z4eXT+PZM9TzeHEWCDHm29InMRU4oV/j\n0/aN/TEArGDyMMsh7aEwaiPFyhWDDKmac1K8XByM7YhJOD5hcEr7+7PsKWgX\nGGb1vs9ZDVzsMKwMtdfRgDCj9tnSGnJd5lsLc+OUL8R5izh14Q/hUNNJIWhf\n6RP3NcrpqqvL7CM6Hv2A2Yz9LOuxrPCilUQsM2WsNo+zMw20WfQDIhS29Hmy\nJTnz9qc5QIYNrK8CMkPlEsG6LYDwfmP1YevtK8zEfgXH7JIHgx9t0pSmJw+n\nFVesXxWU0pFDIDlV/7Di86cfzaRF7gl8TARVD/qZkycYAmiHkRCGqXmxHeZ4\nfAI7\r\n=lykS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICzSWuuJD3Ld5Hx/LkKPM7y09q4zBMLxObd/QbVHyVZFAiADKhF0hsVxPDOR1SfypXeeHs7WRIgwlM3on1m6YTe9Bg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190706090217_1562403848602_0.13068692518417135"},"_hasShrinkwrap":false},"0.1.17-master.20190707001309":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190707001309","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d287b0ee881b8dfc7fe52bd913d6e0e1fa713d16","_id":"@atomist/org-visualizer@0.1.17-master.20190707001309","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-/XXqnXRrexxjlpdFWYU3DxFJLl7FVcpg9OvcqpZTWQp3k0CxdGfBViE29C+Xa1cPM4cdGrivys7/LCktBbeamQ==","shasum":"1b16ced52e1f9779945b112b679dbcff44b2c5c3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190707001309.tgz","fileCount":215,"unpackedSize":2915427,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdITmcCRA9TVsSAnZWagAAUUcP/iHII1CiTAL1xa2ShIZz\nIk1XPxMgfAfKobflkREhluhhATGG4PE+2KVyXLFJV4bx6+AQCjBlxh48HpNP\nizLNzUwDrKfJ6hMcfjSFL1U3GRxGSCRpzjL0Q8BD+mi1Y1EHcCtEojzy/rDh\n6Mz2eMW8LLALcoNzcIOgkPhdApFcDnOxrIsXhKO09xzIlNm7A6B8Yi8qiiuO\nrCMv/ZeBWWxySx+7NxdJupxzspLvlQItmzZXEmuLjUb8itG9ZvUCualianvg\nRM3TKWTukTU9/DJKoVAgfB9Ek/kgrBAN+Igl0MksTebDm/Gtc3M3hLl7OVZU\n5Wm+jxUwWrUrbamnxqKRt4JUsJBP9LpNllfibCvGtMZkW2CmtcH6FJOFX75M\nZMpAo6OMXr1Lq0biw+pHe0cLd0wc+JXin0IkG4Cp/6h7LMRl+dmI6JzLCzov\nGSvC1OmZis1WAP8pkMY9nafwId1PJtutj7MvuhRUnQJSVAFg+kXrzfowY1YZ\nsIogMs9RoOKlQkepAuh62lZOM8j6Ag3z/vVvvCi1Cg+8NFDTNaaP1hLPy1iE\n3I0QX2P91nMJ/QgOZsjjGmO6SZ3hVCn3bPXn4eeWli4pt1BCscV3w3/l4QRP\ne3EErld3Ij+udsI/fjIMsLI4ODdoGO054KcIMMenKfVzUfGWy3sh1wfOP0AS\nML9n\r\n=a0e9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB+vAhWQ8BdFNHm9rd9qx+StrWQN9M+cRpOb2wa3KnsFAiEA7OngM8Y/8BrIIV7zwoZYi3Umaz5XMu//aLpBc0+03MQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190707001309_1562458524202_0.481194262251216"},"_hasShrinkwrap":false},"0.1.17-master.20190707001647":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190707001647","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8f996bc453dd07b1d1142e357a95b22701116cb1","_id":"@atomist/org-visualizer@0.1.17-master.20190707001647","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-BHwQ5Wjux73Nousy1ziVNb/WBqC5FdAtFswh8NZ/Px9r5iECI7HVfeh5Isk/K04LD0jADGqYtvOiRnBzgiarUw==","shasum":"91a8b321f02931bfed2114d482d110001059da53","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190707001647.tgz","fileCount":215,"unpackedSize":2913967,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdITpsCRA9TVsSAnZWagAAgkYP/jx17A6eWgQjkrd/VCEB\nKCgj2x7J+Vq/qX6+0UjluuTziefln6JYjR4tAsPjGVR2Xqxj/pjgXaPsD7kc\nKKiXPmmmC4HMC6koyBM4wmpPpCbgTF4NKGeGtcyQxJamoyOdQR9h09vZUaho\nSIf1dkG2i8NtQbM8aLqN00cuF5GDsjT0waS6w8g3z6OWTYDFinYbRyewQhDa\nIO58Yl1bsPC4xlioAIuxM3a9hSUCXs2N553jO4yx5/UOM9iM/UN18EVXnT6C\nJQ5M0XOoUDzgBCr09pKodQCoh0xRFM/mJlsOELt2u2pP1FnFjCnOnAY4MZIy\ncL7v1KT/PZLWLMDiSAfcQNc/alFqrEu7G53QOA8raUzgqE3lhn2NC5VmRjL5\nKNj4JQG1Ce6i79+n9QfxTPD+Q3zxGDO7zkSTVwBjK8HZL+bIBEiw4b53V7Rk\nUZk8aistCIRMyKmV+JgP7Z0snwkghqvWCM8qR5r0yHeSoOaQ+pEbpOXLwMAq\njUQ11o9oy8ubnS7lenMhP9rYFXPK+gps986ZB1ByXFGNgqhgW3nW6ADWA3Ta\nyycRrBtaHuPVs2QMlG95K0pA9s3UDaNjoSLMi4WDtsPY1bauaqEHHrupBlw2\ndHbaw24ZTDYSdFrr3jEHmYRvOKXLHkBwpRm1fBzREdBaSRqpkc4NxKTf3Vfz\nFh3J\r\n=kQbQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDE3e3UGfb8dOv0yAW8pa+Bfx+OTwLZTqql1/xeN1M08QIgfHBi56YkFIFnxd9wb+V6I5LqnufmQ0a1884t/obZI6w="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190707001647_1562458729552_0.21607791350525973"},"_hasShrinkwrap":false},"0.1.17-master.20190707003107":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190707003107","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ff18ce11e0569075f5f99b90f31d5ce7a1e4544a","_id":"@atomist/org-visualizer@0.1.17-master.20190707003107","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-GQ2bRN7gZj7cA/WOqNoVye7KbIiHPvK+jhnLET/2yPbOZDhes3YcVKNHB2eZhUeYky4WrZh2qrXfmFeQYD1U+Q==","shasum":"4724af3663c041e625bab924089c1d5b88a1666f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190707003107.tgz","fileCount":215,"unpackedSize":2911663,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIT27CRA9TVsSAnZWagAAUroP/i/nzzLH5Ioenh04qeLZ\na4yEaliVsBFpWWurQDwlwL4CB/kJCxpKxT4QGhIEor5pdGmJy6Ptil9GAMDE\nUHXeMtcJMBMtLoTFidiQn5q7El/aD2EQWAbl7LKq+mFVGvRu80eq6CRXqLU/\nnx0CERIYTnkSGhAcowW/i+aETwiXGuBd1W4JneITK8sxXTWYIlEYnUxMJoSq\nOqGCQ/0CoSiLBWuJuD31iGk6gk9F75lI5JGEZK0s0AfCh77qtdHGfcnL/48Q\nw2rzdLTDowgYpP4OVuMKBsZW6/tUkuwbzh8XrCUtiN1DFB6eOzCByn4rpcIP\nn0K9l+hiMhkN7tu/u6tC7npXmH+qbZX4tZOHbtIr88ke38CZt1FIM4kB3lto\nIBB2uI9wg5IdWnaMJReF6T2oINCvKBesyynohb6IhbH/ZSrclteFFdivxx4r\n9NoESxH/wqlM3CF7eAJzE46MvQDLrq9XmXp64JNFyGiuWRcpQ5ZNc+xFkiQD\npnqc1AIyailkw70rSpEqkqRmfUJtUltf5WuF0drsVqjm9+HcQCHDB3vfv21W\nUl4Z+AH7gjKrV7yl3GhmIIaKX/L5nf5uRY7F7uJlUC/YGltwG+mSU25t+5+s\n/7KCSO2HDFzn3Pz5xzl11wcOlxShyNJUAiLbqEtEQhkSiSEcuuJYloRQDsMP\nHGCf\r\n=9+15\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF1ChMZR/r0kMM2L5ULhp+8+ZoEVY4PQmwkfYoIBrBHvAiEAzFlLT42hq7r9xFfMCumn7W9nrihpyMy6KsKwrZfrLDU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190707003107_1562459578569_0.9582154361759405"},"_hasShrinkwrap":false},"0.1.17-master.20190708024751":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190708024751","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5c41c334ad4e79050b1e7001fea913822538e405","_id":"@atomist/org-visualizer@0.1.17-master.20190708024751","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-zwq5XKNAp919/VADptFlflQhsAWHunnm3jg56itxC67CNggPJO4AKplQTgQT22bpkhhEz1SpIeW9MTXon2kwVA==","shasum":"2ed778c33125c723c4d5dda078833bfeaf02f8c3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190708024751.tgz","fileCount":215,"unpackedSize":2911965,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIq9VCRA9TVsSAnZWagAACTgQAJXZLZDmZkk3MCMh/nDR\nDJF6akYJqFFcpFyjxzwVMp6y2G0spmAIjA+9iq8HdY9SLjCvio9b4tR0wkgM\n6cc6Umx0fea1Q7xXWgZOsDk3DDAf2mmpDOw8zRmGMhQeXG/ki4kZ84fa/402\nBgNTnmP43IEJC9+YvzgCHBq+LLZTn+1c1XCoq4cePbv1/tE/d9R5H9rdFZIS\nh/XRNaqOgl1CU4z+c4VI5sKejGoS+Tfg0q4NXW0SRM4MwfNh03rrsP0E44rr\nTyyp8NKb4KdpfqZH4vdEfjDw1xOKqg7XrzeG9GaAHcylufyLSpyDITyiFlqM\nKyNOCP+UeYnpxdaO+MK7uDyI8IsBJzp+/VGkpKC/m5RUVwfhdDFF5UEMKwcG\nHGy6gV1HQF5K2yBksvyxhqlCWbkseZHu1EdhzKoaP3UxfO8hqpmnuwpMpnPn\nAJTUWPEpthbVPX8kpozWeD3S7GY9g+idsbfANGJuYtlp8j6ja3MftWK8FnP+\nJWBdxLPr42b0McRwC0J4bVevpVgM62cGnffd97gMGSyp1bJkjJhspGtRH0yB\n33ATZDxCWwJ+L9t8+cUAVpM6mPQYPJQqmJfapHhmIddh4GMhFmin6Qy0INve\nlS8AZfhy6Cfu0mUqqGXEPXU1EkFuXYxnKRA+TywYbH1WduTxf/CZRfGxcAJV\nNGh7\r\n=R2rh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDMuvgtCIuCQIcgezeH0j/pllXUKjRI/Fijr9c+xzP58gIgCA90yvfCMqamnN9sMnpiS1KwnJqeA+k/ZREar9O83hc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190708024751_1562554197145_0.23574480419705024"},"_hasShrinkwrap":false},"0.1.17-master.20190708025012":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190708025012","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"3.1.4","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5c41c334ad4e79050b1e7001fea913822538e405","_id":"@atomist/org-visualizer@0.1.17-master.20190708025012","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-hm+WqHFVv2GATOTLgCfjVrjn+8/t7AOY6clWRNwKUQKjJTPvsOsX/pTylYT6G/xaNta/jZt0jQGQt9bPeccp8A==","shasum":"c26a13e4095926ed10da9c0b4a97b047f91a3fd6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190708025012.tgz","fileCount":215,"unpackedSize":2911965,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIrAFCRA9TVsSAnZWagAAeusP+gOT2Nqw+/T8xSivaU9n\nLl6V77nxrWQInHNzqyzaNuoSPoySRFUb0CIV/5T+De5v7jNwBbobJzmG8j8e\n3e5IlziBL4tAknvz2sf4TL7Fhet0p4ZTGeG+FTh/8mk4BTvKHs1l1tiB9QvH\nXKM5l3E9gpDKa9ERS8NRrcAwKNWLErkFn4vwv/2DPymQhtbzGTwiuBfRVgUq\nAwnpUsiiu/zFCjl/9/587qFkL2F1TWJEFPDBM8VCKEuksOxZX1Pn9Yxu7NHj\n2ZA0DORRJ7qZcSaZTYDZGMWDy3jWCCzb6dwZvzTN/Ll+OzcGf6dE1u5PmKqR\nBCS74DbFOBSlxyIVWE8if7sV8w0bVy7M9BZUVkg3nSz6It8GJk0TtFRsX8KR\nRNZ5yVoNA5Rff4J9SnpDx3obrqon0hDwFaUKqH1wgM5VUxU0TtwY4W30x2oK\n2472W+lRLmJdJK6MQVsIatHWZA1zdGzw3chwkxH/5TbgHyGSoTVpw5jBzrOS\nxyJdAWjCQx3rR4vZgfNXYirzDiBqC13DLwz76GCEo8R+PI/Pl8GsyPJrVmEt\ndL3DheorHqwhgHk3Omgn0IsBxJBGNFny0xX7ewQF5OTyZSBvso2W9gzxbSDc\n0Ekn/q0EAR/zp5rUnM0yU/4MD5eaZU8+zSUBdIYmsUyLCg2Vg4Cl0cR1zYuX\nJhNg\r\n=AhVC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD10xPckWqO3F+V+FYiOp6BD2stHwsbgP63oUTLnTzg+AIgNfePxrqdXy4hl21L+Bj37A2qPZRo8Lj19U7e7pQfJRU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190708025012_1562554372773_0.6464223699816669"},"_hasShrinkwrap":false},"0.1.17-master.20190708081139":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190708081139","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c6139c24841db33e83253da6d9e8af3aa91d2fd1","_id":"@atomist/org-visualizer@0.1.17-master.20190708081139","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-WOtlRgqJ9jDYzwjCBwaq+Jd4uE0hdbl8DF9iHaM4gL/ns2cKsdEif0ryC+ytgfQQyMjgsb06swfE71kBPecfWA==","shasum":"800c1fbe2ca0daf272e3b8dfed75ebaeb13b6a10","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190708081139.tgz","fileCount":213,"unpackedSize":3003652,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIvwZCRA9TVsSAnZWagAAKqwP/i0b1NQklMGXqhghu2cH\ngsJvW7s1WhetGcyxagXNDvTjh2iro+GTv01BlxWPwx+xCsWIPkK60eeSgAPj\ngHaoLIT/YbDuOaMr+/mn4lB/ubSBgOxMRrQAmLIVr69ytP7zzbAOB+wMvDgp\n/PdbXYLrt9y8XXc5N1U+GIrmVdTamNL5CrlBJ7nsUs9b5VMuFfS3nfFZ6ii0\naXaYEtsYS5ZYJIJnr8XN2Umwt5/YfDqAB4Xg0/2bUUFgpKUIbMrq9RxeJbPV\nd2poATLvEruTVzDshyGLR5dcdNocpoZWk9z3sRHm3gSg8sPP3wLsqxVruM4v\nGVDIrLBVc02IXhhRquHfOKupQsj8+iPH0IZ9KwyuaSBWibXML5Qnyh1vhDS/\nF9ha2Mek3tgolW/oLZJ+6JxMtEhINNOlHPT/rfQbF8TBuxKZZoXqN3rysPV/\niH72wrtsYwOkiUeATkE2mQUeZwlXKvwvdA2hphiwqa0m/mrtMM+6i2HpmGXS\nQcSCcBsCbrhYXKvuub7j4x7uM1Xu+Vaj1T0ODh/Nv+0hXnLjxEfLHV7XMG3l\nMTb0+bBXwOkOZyN6C1aMDpY2HmpWmZDvsL71CRZKh6EulGlpgmyHRV8a3GQF\ncEHqzruKluVJULZDSj1Vlx0E7BB4eWfKl2oVUodXyz98ZzGqqqECr2FFkmAT\nQ8Kq\r\n=oaWi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDg9CGfiYghkC6Gwny52vSD4n8fSL2u9aVLhvIeuPRdxwIhAMJF2LR+K7jtBcTFUsxRNOX5Ri9DJ07BiSFn/RLFmTOD"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190708081139_1562573848243_0.9960368311417112"},"_hasShrinkwrap":false},"0.1.17-master.20190708082508":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190708082508","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cde9b89dd2a8043cd339adeae34c6ca59d50bb1b","_id":"@atomist/org-visualizer@0.1.17-master.20190708082508","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Wcezu2tjs/QnJtnaNsOhsnAXupUNw3r2vLt5Jytlg7pL2kEpZmDNJUR0uYVL11qfVm8M+RDO2vA3MXNyTLOo2Q==","shasum":"5676a5f1ccff82095f7d6a7e192b88eb2c6d3711","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190708082508.tgz","fileCount":213,"unpackedSize":3004927,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIv6ACRA9TVsSAnZWagAAHIkQAJGD8kcSHQ4d9zikCwQt\nnnrE/5GxwjsCzv2kk6X5IfpvvxiaNDHQKg83q38pv5Oafyh/FfKmAnPLRNpn\nWrNd8xtGgsqFKfhGOqFLR2d9XmE7NcPryKmNHDmQUDcLHPxxJQXVuuOMAdvN\nJV6uU8vUBXuNlyU+ODtWj8oBx/Z+D0YOsD6WkQAu6XeR0G23RSS3EXvy/l6n\nKPoz3sWtJlU2EqGb7XxulmOHP3sfLV177GaMEVpAvdpcfGYnbfgfu7klsxCl\njkLvrbB8PyfPlwlBM/G7jxEX3dvmdNVQ1a/oK2q+wHqxF82JKzXJXNxdbT2w\nzJHPO4mJaZeINh/1utigUdi2xVflWJ3uK2BcVcmALS5ldYPUC5xJcCnwHjbd\nl7NrQ9V1xJJQEge4c4ezL4O59KAAt0vDGTlku0GMRQCt8rlg7XAv+Knnln5j\nODYfOSi0qlWbabyo7lw5yOj/wNzwJjObZe8pRbz0z2KoPniiq4OwpwqLLDVJ\n2XYELodtgC/+T+1Qx/A7w9czKdgkgq2Stok5ZxqEnvIqirOGNp3fCdJID0up\noVofU70WPvbHZC5QHK9kWyRtI89RLa17uaXfXuZObZdIfIDED4+vEonaVn4j\nuabN63U+OtoF1j2yQZQDO+CSqUKSj5PfO+5kVKjOOebEK3FShUeXIMVmMwux\n0et5\r\n=9yPt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDqcsD3NIxLgJe1ofCC8bHLawYPXX/3JrsxAQpj0fXBywIgF6b5sTp15wFQlzmvgqR+WVkd3oQ55/4wMMMTEpQEWdI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190708082508_1562574463700_0.004356233675026244"},"_hasShrinkwrap":false},"0.1.17-master.20190708085015":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190708085015","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"161c44622ea5e56dc771392f18c9b0083112d077","_id":"@atomist/org-visualizer@0.1.17-master.20190708085015","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-dOe9tWiXm0+VOGdQdmZWVqFC7/jEs7AumPEx69XO9JlypnkgLZ80bxas7GExWJtH3jApHcP+Mri8FaYONpk4gA==","shasum":"d8634eec72ca4bf8390eb15c78c8680042e2590e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190708085015.tgz","fileCount":213,"unpackedSize":3006161,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIwRYCRA9TVsSAnZWagAAzjsP/jexwG4563ir7CFXQBXh\nMVCvMPARsr3Lm1iCNXU2TBicDmO7dpmMGuUMnOzoTvTzj9srE5Aa19KVoRh3\nDyiq9B0B4lyEsVO8AAx+syWAmyjfdC3AqjMl2MOw+u0AhNRER9i8pBaUFRGK\nsXNHl+uqkFCO/fOWioIx8O0tUh7RPfsyuu90yVrQQrum8t98oqDEekISw9i3\nJomLf6gHry3Gum/Or7qKXZlMEqxjug5j4bjdiM02ks1VTihycYwDjsZA+3ij\nIAhu2aIaI5CxUa/cyXJcAxCHR0PUHx9VxrqkGGKP8Yt3zeVa00OXCnrBvvZ0\nP6kS85ZRzpkugRzedjc8UjasrSq3UiRNUcV3rj2mqPv4gZrquHNIoo+LfKt7\nwPupfEP8ODoqo9KqFBkcUDepWbui4XjEWvtOsBbqal+ZnVsIEmZjdOtgS+4Y\nnDv+jxn4IH/gWNKJXCxo/m0dSKFEYmwH610ohtjGSPIF7r5b3McuMvm93cfJ\nRp2L6akrayeCu4mEE8JirI9odx98KOhv307uADIy76306GJNtNdD6jYt/w0g\nHztY1gXyMBxA8lF+ejwQDZ0Z/GjoGjptYd3wJ3Mric/SaPo0h/sEuEwUwUI7\naJBtZ3azcU8FeOXtQmTk1wC19MAzB2d00KryQ4jODpfMjx/XajNmN02Qa824\nWThv\r\n=Ou1/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBSfm3V9rog2/0ixAVDUPiy9zhpEkBa9UoXSto1lWDPlAiEA4aC+BTGZ0w7qiRm2B1gkTD78JeqBDM/pme5ztCla7RA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190708085015_1562575960263_0.43501107002011463"},"_hasShrinkwrap":false},"0.1.17-master.20190708090702":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190708090702","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c885da8db6aee2eb8613543f3a7e1927133f1cb9","_id":"@atomist/org-visualizer@0.1.17-master.20190708090702","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-4fqAlT5B5Zg3R5IeuOCq2mXFtQF+SEhLDsPV5KF1KR3JwI4mG0qytPqBomQ2x9GRx2SkApu/XWcZGFbeyQa/dA==","shasum":"f71310dfdc8a486756b9c724b8a8194b32694f7e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190708090702.tgz","fileCount":213,"unpackedSize":3007014,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIwgxCRA9TVsSAnZWagAAm98P/RSBweyzrQ/xAZSy0PwO\nzsC2H3iEI9QLHR76yVnsAvbqL0lb1YiCqpcPhIicRPTQFGBQ/Ze9m8OIPICN\nPUNkQdCUxCq4YSsJ4EKLmZW7mAoGX7PztBcYFkjsouA/2fZGJ5TehBdsJeH4\nO3ViF5DJtiZR2NgR/YEj5IyaOjNOw1bsdGAA6LuSqYG/qWUYJv+/2WQyA3+K\ncxwjesmUOF6X/zoh+/hLAb6OgkGZaVtKs1gqaaCRMDhVCzvqjrq3qPy0Ltmz\n3Uyf60OFemM8X/mur7UfB4oerelKX1QtVWg5iXPdzOtrX+xaYEh3O7R5Zi5L\nvL7RbO45enWiYW/eLf/AxC95gc3I2ScjksGZHby+3W5dXM+p0LHjMfZ+bfZA\ngLvWjcSrrP2YHwi0IhKXg9szEtF5yei8saRXczfAEH7PID/hRIdOXYOcDz/O\nIR7K1FA6e5B1vYr6kRXezvD9qbopsVy58AYCT/4kwj9o2bnekdKUGpG5TVv8\nXc/PrYDQLRNyun8nWfwLomAAA4KIoAd0fTKfJgRIowB5i/XRkG4DR/2nMmXk\nAZ457HJz8uDA66DCWkKsMAjPUS7xgJGWFU57l0xI8HHfEOGsXaBC35FR8tdd\nwRCpGtWon8s/I/QMdwaB3I2tbxL9BJ52gbjFs8NAF90pVPqYi+3Z8/QSO6Xf\nZVfX\r\n=+gB4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDK5O10ep77Wb2uOYbF2eYQFAYiQNdqII9TecuujKxo8gIhAL1Sw7Xz6yTY9QcMIWAMYzmBEv25hZRFzSozWkFIqW7+"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190708090702_1562576944393_0.25752961125933505"},"_hasShrinkwrap":false},"0.1.17-master.20190708091542":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190708091542","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"252ae5f27f897c415e85694ee7446326aeac1a9b","_id":"@atomist/org-visualizer@0.1.17-master.20190708091542","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-xTf+GUdCklvdOOTKCZFITYaMth0bpJbIcJsGxvBz6q1CIA9omWfEzs7CEjJZXMrxt/y0cY9y+6kM0uTOEKVhpQ==","shasum":"d84490e4ca82e5695a74b2e2412169e314c2a8d6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190708091542.tgz","fileCount":213,"unpackedSize":3007055,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdIwqMCRA9TVsSAnZWagAA5vUP/3njAGVOEkDepyap41em\nRgoOd3DUt6OCjiL1IAI2lVBJR5SWoAi65fuy7VpVdb0jn+oMpqN4GSmTb65L\nl3S/rHX8R8GZrxizNuwMRmDG6Ffis1SNzfZw6vjlHTKbC2FhZa9g1wREvFg9\nIpgF434/Nlb0njR1tgHbFPMqQ7QjMAhKbwLkyB+ABHygcKsfdF/UKQ57j3oQ\nkBawPLxquL6TsnUbQw5YDZpA9UmgeP6H3T4TnYceetbkOW5LVWXJ3xemqEcZ\nHIAcgzhQ1RymOeUM41jWplCsE+rUrwvPnUzA/+QPLUh5smAYOKJ18QBSxMzS\n23QSYPo6WCyLdxXJsl/1eqJypoJa52gyepVxB/Z0IleIEPg8HKJr9ddE19Km\nvvtbqMng8eLmWq4587m0xilWYAOJxW0DkPEzIzgcbzIOw+jGEIfBkU49Wq6d\ncQRE9b43YAvtIg3ySi5WLo9kCFCrz7GGHKc3Oozvdz0CrHS2Ui3W0BISx3yF\nVY8aeV5oQiAoQog9Gti+9aV3fAoCxjQOEaJZBM5jBw9fcWoo6myjhH8OQAGd\npJboqqsLttxcsit4Ow8AuGth90NJqLvGzg7WO8BSMuzmw/8Yq5Cl4pw+0Jds\n2lxufJ0jbgBjVykg5WTetG4s8pkZPyCMgmbV0gjNRbaWZSt8/Rsu5gkHApGi\nAUEs\r\n=D/kN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeBzwyi7AYALy+ueWVQtdD94juNN7U9DGGJc0SnrFCNAIhAKpC+WhF7Tc88ZS/dte9zaNUld+AKUuX+9vb/OFEOnxy"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190708091542_1562577547605_0.28953482125042673"},"_hasShrinkwrap":false},"0.1.17-master.20190708155815":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190708155815","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1bcd8dd658b9ea11f50f3d16e14773b30b2f7ab7","_id":"@atomist/org-visualizer@0.1.17-master.20190708155815","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Pn9MZDU93GQXQV91qng7n/HuJSxEjFrZALWPUKKxVNQ37qPAS/47ZvsBDOtBYKqG1oFbmgq7KV0MGkc5JILYxA==","shasum":"fe7ff22a36f53edd4be980d27b64ba2eb10810d6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190708155815.tgz","fileCount":216,"unpackedSize":3010723,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdI2iFCRA9TVsSAnZWagAAY54P/37p7mas6O6EO+Bx+zOz\nQMyVEmiqfnzTA1G6doDrs6z2Dt6bgxod8YdVtSEngqqu7uVEgZfXePCfwY7/\n4/Lj5S9D1sAt7QPuz6HvrBcn8cna+G3oJzdBpTHrm52H8dfceA7i/Qi/vwDE\n9se6eR++RIayJXRk46o65yWGUT2yvWPvlPw7go+JQ+cUfcPtlR2DyKIYt9pU\nFuZYCtwewAn95kaahMWI8bZAtzyyHDSRCALT/NNcxj5AhX2Z4LOfCk0GdzZV\nmc+oKUpPu4Yq3kX5w40wabkErlBCjBbbfy7npNhikNEu3z6hEpI/3EBQehYl\nMCowlIPUEUsPUgSitfuwlA8cM2pLfGzm/QfogEtPwuiz8784/G4ObDVbhrBC\njF2xndcZil32/oQuz4Ly0w2W1T3efXcOhVFS6GcfUrlrfkHcg1smvdE5gXs+\n3P+q/0Nf5vySYSg47zS3UXBONqGr/DgteDzMK0KF2K32BASBB3UNnWaVQ32D\n0hqlduwZuXIjJEww52rXv2C9xCBtAOiEol66y9N/PRG8ddTCnCiIo8L2DYZK\npwNE0RPNNzMwx7liqBeyKHy/eT1ToX6BvDoOou6tlxhsHkAXV9Zs6ZNsOS6m\n+Q29Umrb+lejRvfeuvQo9EPwZ0dCEbehkc8uycBe+O2/uB+MtfG/haHYls2m\n5k8j\r\n=ZhvG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDimnlCKKXrorRO100miWMWKNjkkbm+iRgdyyDu1CwgiwIgNsK1E8gpBvNLuSDMN53QNQtSREhK+f28cvpgbRUfMH0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190708155815_1562601604175_0.07813433559757987"},"_hasShrinkwrap":false},"0.1.17-master.20190708161641":{"name":"@atomist/org-visualizer","version":"0.1.17-master.20190708161641","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"08cf348b311b20566941a428ecf501c97c1115e0","_id":"@atomist/org-visualizer@0.1.17-master.20190708161641","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-m+YuZ9Kli3c2IgEoMFHjHS281ka4MpKrr0svPvZCB2hfqKb2h7SZXkJ+ICpvAvbAC3GykK+uBvU39AKXMbdb5Q==","shasum":"0ff9c1711aa36332c97c0642e10846db9fee3ca3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17-master.20190708161641.tgz","fileCount":216,"unpackedSize":3010880,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdI2zjCRA9TVsSAnZWagAAwP8P/AjofmJRPSXYhcmEsYW5\nRBeSRIDfXCSs/xwYxqbQ6vaKommixBWSpYgS3+PJyayCSvQKs0U9GwVCdKBM\nZeMTxC4aAS9/yNRmGz8uyJSL0wkZ0hSneqAhf3H050mQF77hrNRsjJNziI+7\nhkWpaYGbcPYrpeZbCd0kWbJBH6J7unZxVVPBASXNb24JsFXEkZhbHINDyr4Z\nt8dtEn+DNgzA7PECuq0COza1QAXYEVPaO6dGbvkC9eGpmlSaDhXrua8SpqfA\nH6dc7VGhQyG6HheScN2OPjZDEeDac+mRPs05x9t2RkljCLesJJ7rFG+tOJN0\noM7oE6CMKTGSQrqd4zHk6yJTiAYqbIpGKh1IIesTwtt0+MRQLgMnw+FujkSq\ndeS6VcX5dTFF8Br+3MXDTLNVQ0VHHD+wAMk+CmIlPxOvp1bPDq/R/uwYO9QD\nKd2IVm803aFKaWPy4RBPF+0OU0MbYy/boCk5zELZjwQqUWNxb3I3VfiVvuu4\nnxyHBo4q4HhY2s+kndK4q2Bly1r4Brekp5p495niz72lU77CebZNtk4lotYH\nbba+B6g184iSWqaBmNarHphlbg30MPXoOYr49yV3rAxj5cFK6fnOnktLZzov\n3LYitzP5Dlr6cXl1M0gqnwFMjOiI0JxltNQ9XAsIga9gLJYxLDIAL/VRcZuK\ntZ3+\r\n=gn3G\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAxen7mqy+IOC1uPmH7TUgEfvO0vri9EErfrK28m0f4gAiBdPKINStvAez9jILQ1YDu7FANLr0JrxKmy6fUaZbscUQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17-master.20190708161641_1562602723000_0.4442567859327924"},"_hasShrinkwrap":false},"0.1.17":{"name":"@atomist/org-visualizer","version":"0.1.17","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"babfd7864738e1cd8b3ca2172e22d3dc15ee4156","_id":"@atomist/org-visualizer@0.1.17","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-ebCuZV6WngYQIlh/qpLkdytIiPbi3HNXHp/qnGnsxOseHtxzssl/Sc3T6iz7+0Z41y4bZg9b7h89rHJDd8WFyA==","shasum":"c6118c3dcd073c6fe246877b3cbac8e57d3f998e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.17.tgz","fileCount":216,"unpackedSize":3010858,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdI24aCRA9TVsSAnZWagAABX0P/iqiHHWARpyvO3wg0s3V\nq9yWH3REFPyMiGs8JAzamF5Oas3dffTJ5dLjUGQEkQdutBz5L1kbN2RVG60C\nMqaxwQeKw+PT+1BEavnYfL9K1OzCYubDAGmTyBCebmydGeDbot3HUa9wV2Ih\nRZCRIS8ldIammAvB+m8CufBB/tU/XSymbhtfiVZ+nR+PgwcHiCfWCEAEj8AC\nF4xz1UHBdhWHtdlDWwlHNHR4YCppY85NaPLl/l2ru9COVT4fXCwgHLOC3yCj\nShWal+5NpdI5rSxhZyqFw/Ie1Glcv/wegmee3lPlj2kG6HNj0VYD2WxMnJmR\ntyY9IgY3d2ABXAKwEjiW6R/8G/HM3VUvehvC8mF0NB0q7EyLT6kADNU9NWOE\n5uTwhUSOlJBN3n4Uhsx8Y1FsL2exdXl+H/c0+f8oKEwmN1EUhV+8ZOpYqzB9\nCVeRGZRpKuOa5Gtk8+sC/TV0a3eph+PTiUIugyIpbxL+t4RXwmeHZqOnt9le\n6HEEskRsCqMcs4Vo2iILKjJVfcLJDV6624SBRPBxT8OKiLiUfWu9JBB5qFOg\nl7vzpykcwBva0iVsba0dZNyhRjB1DMlqhyv3U0iQO1a5n0VVQtLVM9/ADCQW\nk9sVdhCYClkmgCAwVnv01kFGvBQThIZpl7tWQA66xvbrxEVmjndG4bDGGvEg\nlcBd\r\n=ajR7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCTtihHZLCSquuRT3jVbM3V8iSYr8Udp0zezmilj5551AIhAOO6FRXCvpQDH2sOPILauHOXdWv2K5Zcm8ET9NGTcaP+"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.17_1562603034356_0.23968897411245593"},"_hasShrinkwrap":false},"0.1.18-master.20190708163252":{"name":"@atomist/org-visualizer","version":"0.1.18-master.20190708163252","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"acc10bd5d6d4aa39ad22375568fde7d3923db564","_id":"@atomist/org-visualizer@0.1.18-master.20190708163252","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-tGvLwIGA9ZHvClMtTOrr4FVLirUyfYKX7D8/mUlKEO4Cy8bqRWen5j/0vS5sF4IxxCCV/vNc2xeWMedCFm/4Ig==","shasum":"d08649d317d139f7ac5ad91b306e336efdeab7c8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.18-master.20190708163252.tgz","fileCount":216,"unpackedSize":3011031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdI3DjCRA9TVsSAnZWagAAZzwQAJ4LMIeKfQwVtDGM0K8M\nILZh15Xhs/62qVpg3yJ+g8pOKgc+mhBkGa4u7oJ8Cc9a7qo13ytavtw9+HDm\nUviy96lDXi1y0BuJTi9kug08Hz7naoUoK8oYedtSiTToDcZNyrtLlPvhQJjK\nI9pTojHBe/vLeb2R42Zgy8T5S5tNX8jRXErhEJG3Z1O4xHyh3ODelypoZvKC\nNjUYiMtEpgUBJNJEPpirIwBHoUtNcUrOk2uGmFq+9sMHBNiaLgr1tXnuHi2N\nNpPduaCjpxVe7JBrGQzoRARe3IC3dH9FnrD7CSROkLLH2z9tL12mvtaqZDoa\nmfjQVz64HdOPqNXpcfzYYlxL07tWnMsaVrTH/926P05NrkvfhwBOQ+29MTow\nVKnaVkrYpTp/Tj2V0BVNthuusTnco/Xl+qieSNkQMe/vfvINKsyXDNcd/nk3\n6vdHZm3wsiaDJ0+OUjuAyOs9Dk/fiVYx3Ri1AhIPFQGBWEm0oj9u0jgcuRsm\n2h+pgu8biR8oZY92aL5qwQD0cjGpbA1ipU79pdNy2fz0w4euyqybd7ab32Km\nkwA73hYtkJt/dLfismNeG4a979Xg/EJ04JjQDlzPZuz7bx6CN04EPtoyUzjY\nR0pf+Qi2b5qNN/G2/nIGQTiVLx9yoV2BckdtT3mRiWumnRsyoGV0Simw2p54\nuB2X\r\n=IxTU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBhbxy90+TYVvygT2HJY+tYHJRnVsh0yuiHqffc0aFdiAiEAhKtfpXJwSaAqv8BCwqzodIl4ztHbyDIaBj7onWnQY3k="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.18-master.20190708163252_1562603747237_0.31909656660796704"},"_hasShrinkwrap":false},"0.1.18":{"name":"@atomist/org-visualizer","version":"0.1.18","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"70adc1183be69619dc9dc260ed255ea582e7abe9","_id":"@atomist/org-visualizer@0.1.18","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-2iOSf55Ud18JUz2F3CC0EC8lgreznInLGqHpvh+97+J7X07uJyo9OEMpj4F22ukHJEox3/xzwu9kLdoEq6V3zA==","shasum":"7cc9038da46d92559b4bee3af43382d4c258fc40","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.18.tgz","fileCount":216,"unpackedSize":3011009,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdI3H5CRA9TVsSAnZWagAArkQP/0JHctlELbQUSJrcm1xI\nZjmf4FlivrHlZ69mRcaw1fgd08PwTnnmYdDNQObAizSc+dmV7zpWHNFvdbBy\ncBLlGIrMpSXysyIPqoDhSNrFcGvj1lD/rjUwsYRtvmw5F85uxW9fNqCcmv2W\n5JYsKejipJCaYsSJa2B57I6ROtQsWIXByz7kNpLx5steZmxQjmodqF4ziwkh\nPCkwLDouLA5oYVWJV2q9/JshI3t2Iwm5AU8txIrbRN8G7+UheT+zLZUS1OMn\nsufr8DPm3vVSUXHjFnHWYSVIfi5kbONbWEyybnI69oh2OvbhGNd7dr3XdYv6\n0XBBnGTrs3ym46rR67+U0UdBYs55LBGWVUT+IC8oF5zUtwUJal537ap19xl8\nbX1QD66XBdTXttrK8XVhhrHjtlYnC1fjXjGGPXGHXOYWKoIo+ysvmGjI9cEf\niU4A28ruNJf+h9UZfSCyxaWGhZorK5MccnDEvAKTbqca7hVaBoupYBzpp4j0\ndC45voCs06jTf763OW00EQpM2eQoAGAEEZDTgbOGSTD1+/J+1xoIUPuFrd7b\n6NUsvCUWX2hYwTR6sbj0agTL2NZYqpsSkdoX3OjFL8UZ2JNAsH+Od0k/0Ros\n53SWB5815f6vcLr1N2sfjtH+h/jfjQ+HqJGpM929HPOUbuzdep0Gs/fb5FAV\n4xXl\r\n=Di35\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDsZTwSxm82F0yAZhaybhoq9MuCJdBTuZ9whwn3rWWRiQIgQTk2Uu0niJemB2OVxYI55pB/l7jl14iD+c7orlGwa68="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.18_1562604024423_0.29219310728786074"},"_hasShrinkwrap":false},"0.1.19-master.20190708212315":{"name":"@atomist/org-visualizer","version":"0.1.19-master.20190708212315","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"612fff2d754d8d1f59f670922db7aae4d156c291","_id":"@atomist/org-visualizer@0.1.19-master.20190708212315","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-W2cDwn/tGneKVzKt/gTzaPiPsVk3m2b47x4j0nCJlEGQLK7DOclKOEP0nTAI0qqebd8N3/s9+elQs2z2KERP8g==","shasum":"f429461e898a90265cba2fa2b6e17eec2ff12546","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.19-master.20190708212315.tgz","fileCount":216,"unpackedSize":3011369,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdI7WYCRA9TVsSAnZWagAA1n0QAIgr6Oz8Y1hH7HaSQVra\nRogjhJ7zzQIkOER5tsWjwpSg/PRUIFStFfj/Erw9HCtPxTeZIq9npcs2ivyr\nhv0F0nhBSHga/OAuoOo5Eh9q44r66UC0rbW3VSvN7YXTYPNsmyl5xoQOQEYD\nmXc+Cm3FYzzsh9Gju/Oynhau4qw1wuegzC6S3nz4/vTlUWJGgvDg+ekNbLz1\nWMbp1yi8LEBTpEL7pFyCLNhCL8UZScKMI/W3qoh14tt/NoyDSBqQgjSZ5AHq\nGYGPZFbdjQk9V5tG4LXtii3kA79UdPMz/70j8yVL7PGeNPd0qqrZXz0x32am\nHOzq2gkjnJhz3bM7V6eYN0w0Qo46BhJHyGc10ei+yDdU+49vFuAOYa1uIzst\nqaDRR/OLtB7n3Kqg50fox59+o7TFvXjhCL6Zd4JAEoWzSHb92P0VxyuSTPBm\npCMpG0E9jUnNC2zk2k9j46+nfG0Xu3C/1ri+ShdyAPy5fey1zFrQcOIYjWwH\n5ag0hDWY/yuWzw15zLp61avdOF11MKidpDy4GY6NtFV9PiekJryr0Xw2qw6n\nbmDieCaJ6YS+5ZiOEXUGxU1VoQZE32uiDZYpt69rFme2ZyCFz8/UjuR3wWqr\n1ygECoAbY8brvhYjL3jm2UMS7+54fLXWNc7mdxfJHO9B7SW3wopufSCs11hX\navet\r\n=n0lm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDuOFkbl+OrT9nJFjesLOnreK2nqdBMdnVuxahPATrmRAIhAMx7P2r9mSt++sN7VGGs+gcL+zbQUlzQP+IwYCRrLerZ"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.19-master.20190708212315_1562621335473_0.09144264915088263"},"_hasShrinkwrap":false},"0.1.19-master.20190708213709":{"name":"@atomist/org-visualizer","version":"0.1.19-master.20190708213709","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"fb010d819dc9c9947f539887a57bcd50b75dd92e","_id":"@atomist/org-visualizer@0.1.19-master.20190708213709","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-YhQOzYvlVEdYxi4GjDhlF2iGHUrS2v2sTU+SYBjBgp9N0GfZ8/f1ZjQMf6j4GWHQ/KuQ3hblI5j7I2ZdXX4ATA==","shasum":"c9c8453b741a3d6a0f9bd57d9d828a04e680d391","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.19-master.20190708213709.tgz","fileCount":216,"unpackedSize":3011689,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdI7gLCRA9TVsSAnZWagAAldwQAJXSo/Ggr51HI2UGv7f/\ninlSQE9g3Akw3Ygdz5/tpthn2viJ3MvE/zGYIDPbqMyOPjWFU5zuIVybVVwq\ncOfY72FTOTHAvvYJXYy7d4S+iysYd++IdFAUpiIOHm8o6pFqZoKSdu4cdSWx\nwReUGIyhbwvet172IxFKJP13NJJknEQH6bWHmnlC5NohiYkFk89pfI4zq/V0\nBO5Nh3vKNilv+FPjQ+Nak38sB0sc+IJPjZyGv2Ya+AJQf9s7F99xU6FjG0gN\nW9RQxiM+KshGAjxuFpnuWxI8ZcLPHmuDYjj19TnvIiudguNIzhHL/VEj+fOM\nOPLBEeypNBKUs72Eg1o3wHRQmHWTTGivpRFPZLU3gGTgyE9JmbxnEHL8iDnE\nm15vqy76ROII0pTXx0xObj3L6gU2w5PSyde4GPOkw9frWwYbj7ZufFp0Dumd\neYLnaVuuJ4psW86Q84vMVaGb2HDzkJ1tMFIOfWN1pjYGAmmOkq8XNXA/q8+v\nHNCMG/w137Rv5Go1HFD2Nf0hk2ETV8J9fiuoxIGlCAdcLxzbspYOcWFGTzNs\n/QrdUtqGzxDGIOd1foyZUe5mfsK/zxOY/uD6i9hEcLCt9e7zk4MdeFgMXCo2\nF5beyeTfKrxPlIJ02ZXmsDmFwRx9v7en90FSrLt1FrZjRUncVW+6kZ2qndzU\nnkMq\r\n=shhc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDz6jdsa0DjdXiuAKlPrFFS1sM0b1/ki0DnqPSnLtTHuAiAC6iZEbt+4z9tiV812nAYbaIwQALCuzRG8kXwmI6itxQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.19-master.20190708213709_1562621963011_0.031068612455149358"},"_hasShrinkwrap":false},"0.1.19-master.20190708215724":{"name":"@atomist/org-visualizer","version":"0.1.19-master.20190708215724","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7e3a507a08496b73db1cba36f78da5d65f3bae47","_id":"@atomist/org-visualizer@0.1.19-master.20190708215724","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-J37XTaVOcjlxkSpM9jgHd/oG8inpue2Gc67djJN4J1cYe3daOoN1J3/mzRvEY7KukvFip3wgOWSAj9V1kTAm9w==","shasum":"1a171493dbdf546da676dd2f9e4a285eb7ec6258","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.19-master.20190708215724.tgz","fileCount":216,"unpackedSize":3011930,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdI70nCRA9TVsSAnZWagAA51sP/jUTBBG+1u0CPbycwYtD\ntgIBkNmlTUM856jK6qI4rcvrDwDpq0GAGOkjVaf+l9g7B+7lXt17O00pTBXd\n7/r1pLaHvlBHDtziFlbmDRjkYIt+3vczssieUV8vJqVc2HfAcw4vVx+D273h\nmS3fyYJdlL4fhbpF05cLwgnOFqUi5TPlTtLjBV5r8QTQBBU71FO/mm67N3Mc\nclxxPnSCFqhbLp0h9/kVvut8g8oQZ1LIsRROtDb23K6NhnY//bALcNp7iy4j\nGsfepMk/UMf7XXlrpFsxx43g5F8mo/1Ul61wZVQnq+iRBn3NO1mP1QSqD9Y8\naiH/9wZg+3/CFyeHHL3ZVrdR9wGxTMvBDPixjljFlXZi3ZUMv7HUYTPItm3Z\n/YE9fV4l0LrcWw7QzC8NBCoL1BG4YuWat6v5JlbmlAxlclgZmiAbToW8obu+\nnoSYl1MxZifCe7h8ruc6sM8uHfesWqv2iBIvJV8o0GUEkyEyVHr8dhKkc1YT\nfNi80+OPQC2jBDsVMJHaD+keAwqC35dFzqE0khvUPec7HZP4/InTEqfn3y2f\nRZ7MJ+LyV5c3RU3bLeZGTK8i2MisOug2XK4YtTRfPrw+jIugi12AJCiNxX4s\n+hsvjIi2BmkjxtvyZh1YP8sfq/A8Hwbm3Nj/bAHre/zLS5h2w0cVLdFamF4W\nPa/B\r\n=hYQo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHHe3+QBxH6L6WgKLQ2oJYXXKAq06ntiiIDqAZ6wdPQpAiBmoWKdYZuLm4cvkVsDS/NiJF8485g2PKg2TpP+aH0UrQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.19-master.20190708215724_1562623270224_0.24254451972972935"},"_hasShrinkwrap":false},"0.1.19-master.20190709013908":{"name":"@atomist/org-visualizer","version":"0.1.19-master.20190709013908","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"17eb207a8873bac878a396f3c788de4ade6a68ee","_id":"@atomist/org-visualizer@0.1.19-master.20190709013908","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-VFQpxC/S1pIePKkO5oPeItrjOfYGhSPWUXCXBjS4dGhHAn06QVvh3r2HyrOaK1DTtHFwr3gh0cZd6nwOJ03QyA==","shasum":"b0f1a06f216d68c612eddeda5e1f69d4dadea865","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.19-master.20190709013908.tgz","fileCount":216,"unpackedSize":3012981,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdI/FFCRA9TVsSAnZWagAAPZUP/iVsmm6/1ezcbRnXuPJV\nnBkBraSRrH4au2KarSxAdyZB/atIXFPZPfUfRF08fWGZpF0irRYJP7kZmtya\nmHB46HU3VscOXcHZqV2rY9t3hOIivj7V1Rdopq9Hx3qNrVotBC0RP4iFtf+6\ndhpC9ZyyrcNdVMYVjfaU93GfjLaZGiqksna3DcMEzZL2wlzJJnq9F85Mvg7z\n+w9eJgTcamoBG26LHddL3Vnh/e9GU8dpkKvgX9S1E9vB+AztiRxCUs8mSX31\n7XMeh+fwEmKkp+P79ipXbeGbkvv66X3Y5wOcYAo6O7zV2RUjp5iv6OsqgltD\nMTZLZHXG+9Ps1o8BH7P30NzQTZHKWpdj1URgSTW80FyhdubtYysHAILic3Qz\nIhDGDptixj6S5/QMsTUlQyHJ1FsIialt+nWAzQvRysRgejWwCwhPMfezt4zk\ne0cWOo+NRlAsmy0oOIkEr3OyKE9YG2Q25rfmw1mMxqG+qSJ75fvkpPGpdEGq\n1oevpXO6yqHenRKIOXPc2blsZL1UfcBzsbmqrj8pMM+i0l7v+MTkOE0qoLGV\njqt1R8zhgOZKcsNl7cWUXVZh4mWyliXnhIdxGSCt6Jur1PILZL6+vjxhDiLP\nEKvuufH8NHUW/R6B9g1wb1EqwvkvTWkdHd3tDfwJEiti77T/V0y6GYM0B8zi\naboA\r\n=2Z2B\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDZR+geN7nTETYYpWe6cY7o8aXNDe7unR0UsB9OpDf6vQIgEkewff2Drd/rives4Qmr4Lw70WFhCtwaqVE/gFylQ+E="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.19-master.20190709013908_1562636612727_0.3736150211766678"},"_hasShrinkwrap":false},"0.1.19-master.20190709022742":{"name":"@atomist/org-visualizer","version":"0.1.19-master.20190709022742","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7c1550dbed8ad1ff7ca19a437d3404a32d33d4ff","_id":"@atomist/org-visualizer@0.1.19-master.20190709022742","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-tWxxKzdhkvU1wE1SCMOjfpBcWvGz/6ti+yVf+NHJLX5XaFIpf/GCNEliEKX5Oiwee7b8MOw/pC+0oLedfBg2AQ==","shasum":"d17b004dfb7bc113541501128dd5de9ffe51ce3a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.19-master.20190709022742.tgz","fileCount":216,"unpackedSize":3012783,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdI/wsCRA9TVsSAnZWagAAYsEP/0J284pErgDmJKVS2UY5\naaA5tdfdl7Ur5XaNbqdhwkknSrNbNMwQrkG7Wl0WGOuTF1dO/lJGvIY1I0Vc\nkel8Ir37WoJeuoY/KBPmROi5adb8k+mIAKX4hVM9DjJlf0E5aDk0ZTUtS6ez\nb3+eWIllDuQAkVC2jr712dtgYdmq4mYnHg2sZlKinWMwKue1sbCtV/O7oOLj\nDJ1UYtbw3w648UxF1I+2pLiBI9ALYHwuAmJeZ5xxCL6c9d2PnCMfW8DeRxnT\n/KwZlIkSKxuhJS42tcGBgkp2Fq8QXEfzWXxOiFLz/NmHlnij0sJ0T4z5xkCi\n5yMyihG6W8mfhufkSzIIgogrVFQQ5I6lbXOzwOdKyrBEemCvdLSxgMkEj2aL\nCGYr3HcE79adOVJfNESccHUWfxQgsM6NvUINAW2AaNRbIhTnI6IQ0ZSO/dgN\npXG0JKoqNxgTXWNMknglvZfXAtGmw60uutBBiHbrXMPtQlGwqxpReXiNymrn\nPVQxCLjMWH8AOYEah6SXUR6UfElGNTS2fPAR50wLpu2YPSthVy86Btch9QEQ\nY00D4bF9MFIKVd37L30MDSHCZ95MrLDaddHc4a652yPVou8RfvfbXjYbE4wC\nH9aBZ6YUCkVpElzlL6wajTM4mdeHNYVMAx11ozmGsGwc89NpbbwtQEVs4wft\ndfsW\r\n=I3yt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCLaYV9dSpg5aP9T69/0YTP+KMOmJMw/nW5an7CHBogZAIgbKcyO61/pmYc1c6CzTSV8EI85dzoLlh8GgUyBE+Eh04="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.19-master.20190709022742_1562639403750_0.10592579782170075"},"_hasShrinkwrap":false},"0.1.19-master.20190709050336":{"name":"@atomist/org-visualizer","version":"0.1.19-master.20190709050336","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"97ae890547282c3f5d89660d98575506a18adc3f","_id":"@atomist/org-visualizer@0.1.19-master.20190709050336","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-NJ0J1uZ1V++EQmmSMEKWSgV7RJtxyOqkL1VmUdNTEU7qkwi26BM/3QtbsoW0ffawuUBkOwRAMTQ0dUjgYEnmKg==","shasum":"a89de33c95c549ebdd234e3d0b67d54c2b455f3b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.19-master.20190709050336.tgz","fileCount":216,"unpackedSize":3012658,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJCD5CRA9TVsSAnZWagAAQqgP+wXaVI6xKnQVZxAvhPTv\nOcqgXCyNDGhm8Ydb3yFy4FkGvdtXSBIADOiMherkMCUdvF0IwLxhefDRM8+O\nRga3FE67ZvfyFAqTV1jN7g9Zbtf/y0vQDiKshQ5HkAKed4VNC+nYBy+RxhG2\nHimIBxLf6yOo/AAXmD+Qly/jAQoP6myGNQk3tZ9QRIJRlF2z2r6iDFB7TAev\nwPQAg+txgf/bCTzgsQgiGufbv25tF6ozkjr96PZfTDs+CKRp8PxiZAZRprXX\nU96Y/15C+A18ZHEIRj3XaENsCbvcm+sYsZP2RhZ3H+cGYeB0GYbYHrSPH+qM\n/C6LfK+5WavpvONIu4patV1Qa+6/2FyCQ2XLG8gGxNxygsSwh5sXFOwAzOG5\nL6Wfkd8speG6zU2X0CG1ey5oG0W7GZEYSONTmW7agKNuLc8kaDVpx5hzM3QE\n07yFeYLk9JZpawQX0gsMnxAgRaGL6D2BpAf3Gj9+BbcEVDjq9glgLJWIycaq\nZAJjUfWA2dkUqdy4NtccME5SYo3mmmCThbk+rXfLRQsHtYMywSxZYNXOJfUW\ngxjlLk3lP4f2Z3iJ/B4oEYf+19GWNTnSRpaz6XdfWFWzmzBpUPS+lPG/5/CQ\nWcCquzBbwyEhb0V8MYdBQ7r4OVMVMEP4NCHKWwNZRYpU00GlZ+BcvqVxTGTY\npVke\r\n=n2Km\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMnHqj9RQ6+dtSAMPUC9H44E2pYVuVTXntV5Z0a33cCAIgax7MeXcwkLIsKyq7PO8wKPJkx8XJg8O57JaP6J+lsWY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.19-master.20190709050336_1562648824650_0.11901682582523421"},"_hasShrinkwrap":false},"0.1.19":{"name":"@atomist/org-visualizer","version":"0.1.19","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"gitHead":"0dacf62649697b7ae8ce288673567885cccc5df8","_id":"@atomist/org-visualizer@0.1.19","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-AFCpU6wY7wr4TakQQ+zSPs/mi1AkSsPeGfdXUm3LRXF+l20S45ELdYq5esc1RCcNkMtwn/0Xb5zWakcC1h6qtw==","shasum":"3f376c3c18baeb9b3050d766fa0629a59056d166","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.19.tgz","fileCount":216,"unpackedSize":3012636,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJDXRCRA9TVsSAnZWagAAX8UP/A8QdsX6G2GwnIQIQj0P\n/9G45KAPK4uoYgpS5uH8Pgi7T2cw52YhqAiFk98m2ZMp8OrFU+7OJzcBFQN/\nRvuWCy//qZMm+ftDB9TZE6CJZ/lJ32RjsoF2qp6ejSLbcoM9jx9MbwwyYjv2\nPcdCS5M506+369m14dnBLbuxjc+2FQaOTKfVn4QfVXan/VA/b7vVqYEXY9bi\nsNDq/MYm8v0YCBELihWg26k0D0J396hivMSsQ03o4/hcRzrho2KFIvme4DcJ\nvMZlGUxUPUEjRc39NQ/bm/QUNStyUvEmU9wsG7z0eI5sMhKVZKNOKHkrkABE\nKF6bHrH7gu7E0qkZJB4MlUYpS7jaYL4HbtqbDN698xk/ZRLPwfwum4ObV1Yv\nWFBGNizO4EtJ7pxA9e48AuN/pW6Ha263W4sVflqFw1THfx1B9LEFzcl/fi2r\njSvuPQKZx4pbCVpDRdPa4IVK2a1v7Lz28Gs+5eqgDEqhfBH62//jFk/z/EzC\nNCf15DOP95CJlIWwaGBwfQLL0/MTqcsymRxTdRIEH5mLbEJXHHW2kxdPU1uw\nhljayqu0ZJUsh1SOJwgGWjwhXHMQ9As1msexl6P6YIJPJKpes6NB/F5DtOAY\ncgL5Oazlb19h0nrSZeEIzd38i6+ZJryeFuULFh8uweYBeUPoCTVWu/CS2obj\nD5iK\r\n=8QM6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHic1D/ujv1mmPYTyvNGtOaWhlbyI+6Lj6e/vQDiJJdXAiBuk+SBQ11dXFiXsK64kzw6RO0SPKo7IByhczq2vhKpNA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.19_1562654160334_0.008403869988953261"},"_hasShrinkwrap":false},"0.1.20-master.20190709194541":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190709194541","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"afa1379c699a596fc1cec70252876ec12be683a0","_id":"@atomist/org-visualizer@0.1.20-master.20190709194541","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-Pl6mJGeFbWqq6orcsvxfQJTfbKb3Oakmg6e0jph5nl/qOGyPwQRpt+E/lgifaAdOY8yqhYU/TWBWuau7qQ6PSQ==","shasum":"62d16c8e18536379fbe581b2cfa89c65eb947121","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190709194541.tgz","fileCount":216,"unpackedSize":3010540,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJO9VCRA9TVsSAnZWagAAke0QAJ87IiNCkTi8Y1xbD60y\nTFcWT3blfb2Ih2ymsdJ8vSPmRtjilKbnh37JcP9z4K9P4Nx2xTVAwNQavAif\n9LlmwLhanSVa074Y8yRMIH7nJmZR0gvG4k1bdKvz5RB2WY/iLTGLSq+GSNyP\nEWgWgU/bDIt2bsAO+8iA/ABEt8O0zUvFGo1s9pMOF+38jgOxXMn2UcXe5YQ+\njakNnWS4UvMwdcfElTJfltDG5eMAkjgQvu1Pzi8oU2HOOC6dj/XnAazJTXzk\nks+vlR4ehVg/B5q1sj60o9t2UVnQQN7tZICkFScoROGGumkq5rGb8owPKq3t\nFc97shM1TXxtdZKi7tgtvPTlSC5oc0qw3Mi/grGZO335HmfXc/jCxAEHJykK\nC1NRlA/79hN+pLVqz/8byft5UUqND4HTumImf9Lb0qezzbWxrmkm3IDXprCs\nWtRhoElYEQRB3tJiatxAh8mVll13HwTBy4OzZTzyVcYJ4d3cV5194OxWSDyC\nV1vpyZ41JVGOPtKS4aovzAj3uuRBxhWD6A+HmW6ZJmpIHzzIpLt1kG2GxlTa\ngmjJmsaFRnEbLEptsGnDS1mJD4oysauzsoEsFLI1Hz7bBiFyKkoEmdGytgtS\nOnHu6w4ZtGxlmqs0vliN3nS5ScBNm2Q/XHyfrKkc10kcfVS2Sg6i1AqYV6e2\nGis9\r\n=rskO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD9sVED69Kc1qxpfPUN4TL4BSbijDWQJumkkiev3fXVggIhANmMyGLzsUn+TXFQjeqje3aBQ6KpL2nNY5vuS6UAcaDP"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190709194541_1562701652433_0.8823433223788768"},"_hasShrinkwrap":false},"0.1.20-master.20190709230722":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190709230722","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"56f3415729fd72c7a0f5ee8613a5d6af0e12fe4b","_id":"@atomist/org-visualizer@0.1.20-master.20190709230722","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-CLjL4I7q84unnYYCPGYUABAyIPkf5+jvga0BzHfwYKdidY05oxYBe9AwYGqW9DtaLtG+P8x8+5ZSWk/xzjxuig==","shasum":"4a5d96c136095310c8d53d003fb49445f1d75f73","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190709230722.tgz","fileCount":216,"unpackedSize":3012240,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJR8lCRA9TVsSAnZWagAAzZcP/RyoNx6t8Cf72wYK5END\n7OPjKI+ebASnSLoz28zITTIELOADTo7oQUyEbpB4f18Asa7n6Zj25mZzkw4P\n6taFjLy11S7EKiP3RWaRtyHjRTIpBDBbNPeuIAYahdOO20QBpAkFi1HZ/e98\nyM5QCIUx4daltejKtcU2JnMBYK1IAegrYQWJMByH+H+T6aXt0fmkPr6v2YQL\nKOF4Dyp//SZzuUHpu5wSmm902sOYJivPWqkJ3Yzd8w8Vi19Lh0QsaH1d1wx8\nbj0tScBa0Ngx8hqnE69HDvakFEWdPlAVO+3g/+/rSqPctMDtnGFQoVqA5vDL\nmvPA57tzyjtLYAovfbEtW40ErwrYuX8pkoukgnqCHYTBMmyQzIrzzKTcYYwA\niin72PAArtjNIYqJt6/Zz8n8aq1Ek9w6hery1fIAHMQ44Isf/2xIVkY8OvmF\n54bDzUe4BBpG3hxr3jz7jCnrVQvBw8mHB6LdjWdQdJpAjiPatApkGGH3DC3x\n9ttzI0Py6lxvYdGXN9Lluz6hY526dJ4TIEM8Q2fK51jZdkdCXRCLkTvjVqUx\nlWg6ypNLrpnqN5/4nND9F3uUosKQHgnlz78cAODbEWT93SNHjjt1m45xNo3c\nJf4BS8FYQrmLXV16ZfJcntfKvAIGi3117zIOPgn7S9UBhb4uUklTRYopmnix\nMK2L\r\n=3dfp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDOSBWvBzigZIZ2f2CkOtoTZU4+3MO5eHx0/xY6QufLrwIhAOequymm0f9PVim+cHJnwy3IhZNmnkPelIXPrPS6gWco"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190709230722_1562713893078_0.32177301995294294"},"_hasShrinkwrap":false},"0.1.20-master.20190709231959":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190709231959","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b3ea51cd45ca42690c956a5583a494ad9f711f29","_id":"@atomist/org-visualizer@0.1.20-master.20190709231959","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-9aFDSPwXs5FTRn1RhlrqA9jDfqpxIyVz+s/wEYV5cLDuU6HuJ8AJPjdsDuZYd0RsetHJ+/hfKYpTMfiHVAdIfA==","shasum":"df32477b7657a29ca8f41b5905251e53c4f2eeae","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190709231959.tgz","fileCount":216,"unpackedSize":3013099,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJSGKCRA9TVsSAnZWagAA8acP/1/Yw0OEkeq0etDu8hlF\np4nPW1aPpEgWPkLYLD1WbOdY7bONCk6GYeCUilFgDsWkdfs90Hkyy0llkWq9\nGQqm7z1384Oi2b2a3OPz2KH+IKFWeTurWovimJNTj722jdnXyywPhdxdBnYA\n00yYaM8UqtuUCQ5rnFyL5GSCsblWQ6fICmptzouY8OfbD69qSB0Isj2TijEB\nQb7EqGiyCkHPCpDIzlTFivqK9U8HAYhEiIVrpkLtZeDnWhj1xOov+F3E/6E0\nGQE2fHJB8ZFllVk7kiU7IpQ9sYgXvmJYwxpikKOwb2+hyEZi2BWV5xIjsv3u\nIOl+QVF30hMch61asEMuresKGjvF4WTiPFXw+r08C5vJmTH82cTw7A0ccX6g\n95GPBJV244X7E6eW2or5yLvdWP8iwV4aeI5f4q/0EnTHOm1NQCwhJ336YuYE\nwfJhb046FRrYOo+Fsj+cugFtgSlK/B1njrxivt17XpBsGtwMcfg3Mz3u+tRO\naRUDcNOHXf28pquf7yrhxE34RDs3nt8caWc2jcLoKVd6Mfstpcq1LNy0Nwra\ngbPYHMS8dp+Y5+K8I4DkzU67SdZ0TzKIyC9BaUg/mD1dtZyCeFf5peHjNs/n\nVarAepzUZdTUQOp8Ufd98US+0OshizPL15K6KOAW1TsvirFVD8jGL+8qV4b3\n8+1m\r\n=ccuR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHgj1021ku10Q0KX+rMshjolGUClXhxjwpJ7fx6JN95aAiBzDS7rXEpxANK6McDDvJ+bELCt0dy0OoVhxhlO/7AFqQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190709231959_1562714505764_0.402522020014066"},"_hasShrinkwrap":false},"0.1.20-nortissej.documentation-url.20190709235454":{"name":"@atomist/org-visualizer","version":"0.1.20-nortissej.documentation-url.20190709235454","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"24f04264582dfb0d5625bab71225670ee8094bf0","_id":"@atomist/org-visualizer@0.1.20-nortissej.documentation-url.20190709235454","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-ZDU1T772y0jTQHYEFlu1MZN+C1lzHQjoBSmyGowCXUnzjKML9TFAz24/AWHivneY61SOXZoZhU4HtWiVHEl0ww==","shasum":"b571767d1f709312a8b4c28e7904e5b4da264470","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-nortissej.documentation-url.20190709235454.tgz","fileCount":219,"unpackedSize":3017334,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJSm5CRA9TVsSAnZWagAAOKMP/jm27Bnf6chwart0lqCP\n355FpYrhGkgjMqz6RPomieA2y/dbH8n7Sf973QerHU0H0QwUPFxvoQIrTBHj\nZ8OBRWQw/4YIOZAS+13+En1Ri9x55Jgjrwk6XvrF3+QWa3ruI/n11duAsZ0F\nT4S4kk3CkjE5oVa1h/SVmcu6AQ+Ad7RIsyq3p40v6vUSRJU5S9eZODsWuFEj\n347DbYF18l5QyyqRyX6XpANbBAnktOOqIPDkFcfH3FEJx5qReOrlzlFV4G8d\nwtcWtvSOC7lJ95dxTDS1Srhqmf8Z1NcexK9jsJ823yCioDrV1mwkLqnmgE9d\n9DdouOhhqfBnPzpq1+SEQ8nCDm2/Gs4ItqgqTB4B3JuCVIVGWp3xzncPUeSE\n6b/FFhn7dtoy0puUPmXPInY5hCvugIQr/3jlp9MXQdhimVscwr3WKDzPl14/\nJC0sqZnm1+izBE5qMELHoLrG0FMQFBZYlx11IdyetbiP30cVebRQHYYAjuJu\nt2hZm8otKPPpNPI/PUgqIQz6aUwgj6g7zDGeE1BDx/Alc6ekehp7J3AkraaY\nASJBNTyKAQ1TK/zIzkVw3k4WCmhhJn5BeHDp+U50+4BX5FcpkK7vkpM0bk56\n1pIQ2jL/Is0Culj7weTdNMEn4iko+jINVE3UGEtnTbAQ9cY4NmanJWeQMEjS\nwxVg\r\n=wlqP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFE2vJSsxfqSSYqpIIX6L4R26Cn4ewpQLbqJoiGq1b/NAiEAu5VbxsRuGeMAzMSr14kpD09w9MqO/7gxTJG6Gd/twwI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-nortissej.documentation-url.20190709235454_1562716601003_0.7405143014649231"},"_hasShrinkwrap":false},"0.1.20-master.20190710002824":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190710002824","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d622b1f90299c100ddc35f20d80925f329c1db0b","_id":"@atomist/org-visualizer@0.1.20-master.20190710002824","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-9CxI5wdL3F73rnRu9ilmH7Vfgm8PVJoaqoWqj0buJmzW4SpNjsc19SBHNqwTmlqdO7OCK2WALEliRal3ioATyQ==","shasum":"a2bfb4101d7cabd2de0771387482fcf4d9831581","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190710002824.tgz","fileCount":219,"unpackedSize":3017292,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJTGVCRA9TVsSAnZWagAAyOMP/iGwXhG7888YBLcUOaRE\nB4k6mP6DB5rXchq0g+XmdUj89LYkiyiVlS90uvxf9Nb97JELHlNDgfRhWuYF\nfI52orILFTNV5AUVezcyChckIoNoSBV5tD2pvi67sPypl6f2XUeamB0niUWE\nFlCVtP2vNgecC4t6ejbgZvPQteub/nJRE8drySVWgk0FbIp8eoPuU/ejb0II\nixvL6BA9yf1hMVXQBwe1u9Wj4P80Hvb8LRmrqLDgvtG4jmwB2eo3mD8QHJm4\nDBPkOkiIZFcHyPrxm+VAkg03oU5JMWv75+s9gtxZA/0Nyisn0nzL5ApGEXaW\nhyIhDamS/t0UEYrWUThhLEeoUMcK/SYk/dcOQBNmXyBCTaqfXU9xxQ9BhdMh\njxDJlRLxHR3VssdCjm76vh5y0s6R/a+tYlizmqjZcrXtGRqLNiBVw29UWXZu\nkMv7xsR1izWzSB4/HeFXlfW2PUNYYtzAwweq4zMKQNlHNleNeDHGngDxj3jI\nCtzgxqR+256rAe+w8UFAzLE2x3g+vr3ZxUWmmo+W5ESZ/kq0UeZ/gQIIRVJN\n3JSNJtFGk2lLSOSZME7PWDPKudbCH0jSr/gQGTHgJV3GVzCi/cDLVk88mlpx\n23/lsIBplcW0AKTM2JEYtD/f4hHdqhm63OZCYM7BtJkj6T15W17r/DDwFe6Z\nZrPM\r\n=dbaN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJwlDRQZAqzhOEORaJUtey93KjO+265S86KOGO+ZfKrAIgZxBZ7rOqDHQHlI6l/2No9OaZ752ue+OsHUZ7ln86hDI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190710002824_1562718612783_0.8059393342982151"},"_hasShrinkwrap":false},"0.1.20-master.20190710011704":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190710011704","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f9d67f4dbf111a5de4801db7f014eb8d59e921d5","_id":"@atomist/org-visualizer@0.1.20-master.20190710011704","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-fsfQCeebMM85fEKh3hDNeJQ5gEA3uKOyzHVC1SBnFxxumy8Fwm+ZyoRsXHlZZGj1z4Xh/x25vmHlzNp2gJHikA==","shasum":"59179ab45ac71d26c6b070dda071c9d4e279d5cb","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190710011704.tgz","fileCount":219,"unpackedSize":3016213,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJT1LCRA9TVsSAnZWagAAOKAP/3iJhKRoYOkHtrwYWEPT\n4T+1d5leFCitpXdNIphcNwDggQa9vWfrrmHZRxrkxwXTGJrnyIYShXbMMKKv\nxuj3gS9Nob3Cx24JDUqr8QUjDIdCG9Jxl9c7iE1R1JmwMJhgbm7W3DAn8dx9\n/8GXR0Yjev2kv06VEnKg4pq7K7IMdXgS8bktnLvlPI7Dg/8F81x6Bm2+/Cs9\npEDL/beTlsZi745kn1rLB399stZTfDXJStcQ67SBi6hSTRJkuvZ6VEatQcW7\n8zXdUAGIR+/V+yzmNOFWjTRVy9U2Z05ZO95oDQckHpbiip2YGgQrmKVtSLTV\nwhJV8e8RfVN3w5U61iz/ogMU1/cIC0Guzs0REwzr9vNv51prD8qKL4hkDETv\nAO/W+tPL7ueBacVhSmwNchI/X39ZoP4940HMbB49FkGqkKTruz/1xhCdjTtk\nvMyywCdlMYMwi37vJ1TwbMjG+7QM51xF3txwx6x21jkL2vLNzb31f25nPVRC\n7xZVf2xm1n/X3vS+DPO3cxI3YkMjjEJcCW62qYDIFD8hKyHYwbfaRLVr+ewF\nkH5wBJrComP1DQmstimZuKMOygcsk+GERHFaUu29TJG5EouDNhnkfTpJCnC4\n4CgOWV9jx4hbqXWeJqSc3b+AgcuEY61HSgPOxhBiYk3Dy5CgxbkE+EUqBn6D\nOccN\r\n=kW9u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHnS26YOd4O2QhWE6OlkSgqBR8mSx4wLQXv+1798ewt+AiAwtTQHJM4HT2Zl3h4YyVOklIWDvO8lVNCUPTGfggcqYg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190710011704_1562721610358_0.10744269025933306"},"_hasShrinkwrap":false},"0.1.20-master.20190710053054":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190710053054","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"34e41f4b47460f98e044a76d409907240c38b7b2","_id":"@atomist/org-visualizer@0.1.20-master.20190710053054","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-ylU67T7pAsQIgigFCl1NpKCcPmvn96tOERy5LrXmQxf6vrbaVI/2cpawE4bzVia25LozPDk/JrDJzRjRIsaY0g==","shasum":"df845c0df331c5fc18d27b4e9fda2ab3799ffe2c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190710053054.tgz","fileCount":219,"unpackedSize":3016936,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJXiqCRA9TVsSAnZWagAAA4AP/0StYxmep4MjkyEeEATo\nNTnKrDOHqMSPPh6vKL7Lklm+o7sdS634qMRfalgZCPaIFfQ8AsxzQWO1raso\nh+71bczQEGtxHiNLXVI+A7GIP3gFZqZ3EV3xLYLAGNJqs2hAKN/q2sQV9jtd\nvBJNTuV2jAAmwI4dyvBKhgBgRcGw+AvWAH8tHHpe29rTnsy4UOTDTHRKY0k1\n4aHbbcjzU/bbErv+m28V4+k1W4xx5HZOh/UiffkWdNkSCuQIJ9Bx8/hOEOmR\nniYiJ6CofWI31oADvf2xdgYePOsSp0N5Bl4bZUONzVm40EbiYx7vQNdFakPC\n8kY1BYBwGZxeVnmM+NOQm1DT2WDQ/FKTLTX6uSzp9WCyuq5dU+EEKgFmENGH\nR1i64LS2G9ePzdSRGTpMWmslVSj6+7TSvERV/FD2769pqHVABBvbLHiF3V5e\n26Y7GxinFMyC9J7CY7kY+IDlKIaYD1zuddiZxBL2GkJ75QxMGkqejWfW4MjO\nl+JiMrbiiPF+PL8e/OVBtZhLmkYuPIW0N+aA/Cp72I4gi/8pbzCeT9olxlq3\n/R6Vg4h1vpx0/i4IO/JEmEwAUMBGW+OV29tsCUH8sV9Q0gJDe2rUU1JiCgkk\nCfczfL/WpyHc3WqFsuNYWqA+NkVPzdhq1P/tKV6Ao/8nq17djFK0x2s0XpLj\np16h\r\n=GTMu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDFnLR4Gvu4oNBVjZa5SIjFuSihIsPx59RJRpVarBTinQIgDcjWm+A9PkTVdcKclBbIVnoelJ4Dwa1M4UN9pdDFq+E="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190710053054_1562736809057_0.8137170624836971"},"_hasShrinkwrap":false},"0.1.20-master.20190710061316":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190710061316","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"75dc158775270878d863fb13695d6dc6786a4bf4","_id":"@atomist/org-visualizer@0.1.20-master.20190710061316","_nodeVersion":"11.13.0","_npmVersion":"6.7.0","dist":{"integrity":"sha512-yTSLwa3ivH8WODY3PcS+3JNA8/p7mUBvlm7Pp+ZttzM9aQGCQbM4OnWsSyXB9Hhmor0eBRCFILP0t0qg4QoWmA==","shasum":"5443dd78d3774e94d9b7ffa8d2f5b4981b814892","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190710061316.tgz","fileCount":219,"unpackedSize":3018541,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJYJsCRA9TVsSAnZWagAA518P/03swmO+kNr0ggj/TScZ\ndDaQC47jgCIwoeInH7Ln9D/Q075uqbhUenyFJk4wSiZ3xwD3WxdcaxkIMrqF\nKVFf6TnQdHaCiuWSX3KSq5Proo9qgAujWNvUpp0Z58K1cK3SEK54LshWhBMR\ngeW490aUIpMeIN+tDL4hf+2XOvp10vr8OBZ6nW/tlgwH2Vluhb8x2EapjHN8\n2uLAERRJCKVZdH32ZS7zHbXuFCkA5bM7hGNjAzlaU0HQAKibi8naMZt+E2lM\nICQQ3pah3vI+Vo4EV31sjCKtEhftIEY5tqb6I1hn2tzSIuoFyIhIIy1SIcEQ\nPraBbU9rwqqUVygsNo+QRadpOPu2JHzbSnBTqC92xipfSBJwxe7orfE8/TEv\nSoZROyjxoOTzwVeNRyTjPHwh60TEUmqvS/kNVLN4ZgTuBR9ztODDeo45NBhP\nOJ3CT+taH0p9oVOIj6AgHugB3ACouHcyDoMgmc400cElFqu9GWHp6Oh3ACPX\nKpgt3EZgIuP4qZ+g6B4o0hbFh+IINxmXIrjrU7LZ+lnMD23l7V+OkmbdIGdk\nod9LNRsFG3RAdre7FsbSodn5QmOrKz5Q0ekImpBWiRC7K3LHw6C4E9PNMZvM\nlitqqrf0Wn5TsQQHPi56YNjgzJ1uOzQ1anOgz7GdMBqigGPb5FCiDPIWAYV/\nCFya\r\n=gNBL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBstXByCxowc+b0ammYaG7koG76nakiNPCSzNHgHCb5MAiAfFeTt4kBIWpsaQISMXKfYk0w7R0/mhjOSgL8i5nCY2w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190710061316_1562739307264_0.5776441449902141"},"_hasShrinkwrap":false},"0.1.20-master.20190710075106":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190710075106","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"970f83be727cf49b6967f19ac7b8e72d94efa7b7","_id":"@atomist/org-visualizer@0.1.20-master.20190710075106","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-QesKWJ9Jnpgk+xTQ2kTxpxzJ5C0zBCTM2emdJd7aeCyFSKyaXmxermrQSGZukzLgavyM1t11NQoTtEaZMAsfUg==","shasum":"e5e35baca3467efa96dae502106afd07b6fb9bf7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190710075106.tgz","fileCount":219,"unpackedSize":3018599,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJZnCCRA9TVsSAnZWagAAXjAP/jUuyJpPtV3oP5FX9blN\n8g7UTPTLzH8ueQlc7FvGij24UDhLVLrDtpogljjainjTnTp3jl5b5LjkRkEW\nxqpOChGQqclLaYHaQ5KuSJlVOzXgRKx6RA4WfypPYvwDDnfRJpswO0ooZgWh\nEnobNzI9N57m8qBDmxsYUHcuf5JiLvvxhbD9PI55KNoDbXBCpB+W+xsvVeKG\nh6O5XXkRBJU7GqyitDiilS5M3EUAJOzmxaKqZx1HbNT+LyHu66y4LZEBw/fT\naXfaB8oBhCa1Uwxevb/btRN62cy8zRZ4FKmUcm8BKqlN7brrnmqp5DfSu65S\nyEGsnn7j4veANywvbSLWNjoujZcR7CMh37hQdfGs7DTpIr3Hc0ek7iCBEDJc\nY1/I2AVhBe1BFFusA/wnd8JPF/9W3UkHecGIDYMd2svSJoeAsVZsp9OZoR9/\n/OTZxCXGtTOXK3QDKc4pjnL5r0J7QLBKlUBA3wvzCFAaGoAzbmkIpGoZqqkN\nDYjJXcMqDxWtqT+pKqNQwKbKWP6z93X0TXIgiawSbiJXIbI8DOn18px1cK+a\nNla9vD51MNuEwu3du+EMDIJKCjBxWAf3qOfkBU/8icxzuKZDExrwnltbYNg2\n6bQ7kQkJobVMkpKRfAvk8kisynmxw2sm49Ols5oKnyEH+14nX6ZMuJNuc3Cm\n620k\r\n=PdU7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDmKV3ocTt83Igou71r4mCw1sjectacsAa2EGiMjffv1QIgETymFcBy/5gPWQ/iN+XO38j4Ko+dUh4wsZpCtw8Odbg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190710075106_1562745281679_0.3595144614796255"},"_hasShrinkwrap":false},"0.1.20-entropy.20190710080106":{"name":"@atomist/org-visualizer","version":"0.1.20-entropy.20190710080106","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5edaf120a34a3084b40a25a1725ad62d2ce2b2b7","_id":"@atomist/org-visualizer@0.1.20-entropy.20190710080106","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Xu+4o6wQd7P1jmG3nPohnpYHCouN3sIkw5vBP4YaiIJsY+kTTVqsPZq0gAtcFFfTpkOUDUjDJA8wA3umD2b2uA==","shasum":"dc87db0747c0cf85296c482173807225f27b2b67","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-entropy.20190710080106.tgz","fileCount":219,"unpackedSize":3022320,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJZvFCRA9TVsSAnZWagAAEGIP/R3rL3ycUrCwVR0B/wcy\n6UACTVYZcKOehhf7PV+wxALHlxRPeB3xuibqilNU/Txwb6ImX0163VIVUJe9\nk/a5zs9+XAORNpBqtW7em5fhfmbg+hkLKKgQ9sbB6r2zZ9kox1oFqUVyE5X7\n+60+AORm/gJlsPvVD6nIEmjNlXzZlj5OSO+R3rczQ1O3pS3hKBNjxYqsrWPZ\n2YYElIcIpNoVVsxrXpI6mBYwKuW3E/unpNtytzc58hAPE4ZxtbEU7dtOAr+6\naR2OTKPXA1UAPEynOGuuEjWMCwvKH7CbaiyNG71gd7OKa5G4CeagnxFsWkhf\nJ8SAshxNu36Gerud1XShV42iBK/y6TW8Ja5WwBMrF2M7IaXbjmeR+c/UqGdB\nnTfYa2q9sxAOzxRKSEv32ySzGLybELhxgdweeVXWC3wl8JbpQw9E9Zro6knt\nF/SqOxAX89oQUcHiz0c16fYUNTK2GH1NHz99BsMfGwVS2N9nDu+sy7I2otLe\nZRw2nkaep8oJ+QN/bfgJnWqcML+/DvslynwMK1XddeX4fwBsKfaEy5c6eQnw\nn8U/u1MV9iiAv91dMPLItKAfUg98sth+hBP+NR+0rUBpL7UeR+npWsrGOHLB\nUR43w1JY9VrLRrTuJIfO3IAS69WvmsbGtlzGj8GUWaDuUV30C21GEc/Jeh46\nGTBx\r\n=XsPv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDifTZjWJeyZZayI/TcRurvWNJyCpRNdgDe5HbBbGqo+gIhAPBqs1yJiuffCy2XGr2DiqlN6fUkW5D7yrhsYdC88abz"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-entropy.20190710080106_1562745796621_0.476713171871753"},"_hasShrinkwrap":false},"0.1.20-entropy.20190710080451":{"name":"@atomist/org-visualizer","version":"0.1.20-entropy.20190710080451","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c57bcf894fe3a5c6dd9e14069183165218eed01a","_id":"@atomist/org-visualizer@0.1.20-entropy.20190710080451","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-BK+7ynUY5w1E3eZu9TbKqOw+xs9h2xurqDl1qA6r1b0K5+6J5vU6ynHcJ7D5LKXcjlWhJr3t8dZeKVer3drpGQ==","shasum":"ba729e26ea56d7f190c544bdfcb87ca9f847788a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-entropy.20190710080451.tgz","fileCount":219,"unpackedSize":3022378,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJZyoCRA9TVsSAnZWagAARUYQAJiG4P31KniZnNem3bPY\n65JzEekugF123FSBEiLmTqe+MghHkxgc7UdsVg7sRSoRymh9GFAKei8uBPHX\nP3KdEP2nDwguGFLrppyKwkTIzusr4jSUjm10ZWHItq9w63l+tXqeRURyE+OK\nhIUxEGMKZLcmw+TgVRusCGBd2d41s3GgykMh6qir7CTZRBZYO9ApDTb04z58\nf3eI2cDqGHFCj22zDGOrPQm2EQqWxkR5vL1aJhVpwSo1aUwls/IvuGGabv/C\n6oVd8U9T0KfMz7GbAm4K07Vt2121f6SsYOLWFn1eP8OOgsiu4yQBVKJIA1PB\ndru5e/367/1FiWUCcCptdFDrRYGIDH/83QL3hlLgXvrOTT8p+DpSU6z+wOOu\n1PmMnhiXcuatDRRGXCw+vQG6MWio9w4jLMuuY4GrQYFJupOS1B2Gyqn/lRzh\n/p5aCzZC6eu1MIBGKe3Lig6IXA/GLrdpd5J4ulP/J2ab1AdqZDA1qQxvnqdf\nUAl55MRLTT4qe3+CF7l6RFCIcvc7OIJTpGchkDgSfYlTeVpm/DPAll552WJA\nICpkrB+GT5nAyFjbHwVvw1giOP55xNr7UyxOIfv01Jk+DOFGtiZUob3bhWEZ\nkec4GM3Xm7j42mLA3xoH2vp0rSeN/1oYLHn6rQT8KjdD1THoYfbVz8Y9vfT0\n4mZ0\r\n=1OiV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICSN9d0CMVNoRk10bcg/GUA2FuXaMbnnTlz7HxSQSocHAiBeL+nZPKOhbYbi8ES68eSjRWx/R0B4Sq7ohJolLsuYVQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-entropy.20190710080451_1562746023580_0.5330689725498872"},"_hasShrinkwrap":false},"0.1.20-master.20190710113118":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190710113118","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"^3.2.2","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9297823ee8a83a1fcabdf996d663823410e4b1cc","_id":"@atomist/org-visualizer@0.1.20-master.20190710113118","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-vqIEi1GpySOK5p7Qi3qiFVpWKR49VY8N87GSnWEqWlwB76Pq3syRYdxYmCiI5Sev5dI0gw28jGcA4bwkiBhZGw==","shasum":"90b5e83eeaa572f0086b8d66226852367b061f94","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190710113118.tgz","fileCount":219,"unpackedSize":3019990,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJczqCRA9TVsSAnZWagAAPI0P/1ANdSeSa/q6bUa7VG4a\nOkeP3YZFJrRi68ay76FqIGU15T+DjYjj8vc3rlU21mnVIvNl/HdgiR+awnGh\n1HCKy2HXvcHR6ICfJEKk+GfEu92/NchVdJsWErSQW/UO87+kEAfXw8ZSdPqQ\nVeKt1YvcJ/E89khD5T5iHVc7tGDRx4pj+eE9InyV/X5we/tlvAg5po5INw4l\nqwhp6ta0/ifmq4qOt/0Bsuppu2UHUqEpgVPLuXj/g//l/rYo5tQWE/pRTRkT\ndtk8KB9TC/7RWMyj4CWspbbS/cRg8Z1bfMabjnVfys8hrFT7VWdI8Hp/dnJY\nQXUhjCaeI3lL9uOGAwX/BJ3DgwoYbYENaa/dkmJLcP1wJ7mrx0W3tEyc0iW6\nK2ctEqtdO0YdXT/XAtwwHZQ915iuKHRHhEuL/LnUCLWF2TmEnUd4FwfsnVeF\ntDyHIJve08OlSQ4LsfuLrv8wKMBPH1GouPaf9AcGnjPkk1FnhN70OzGcN73y\niHQsKK41BjplL6oHGd/zNaeTjqgNHk1zEgOZUNxABqzIUxBEC4u91vSn/JvG\nJJIx16foOkAkHEg4wHp20BZ+0I4A3s0nQok/qPmdx0jn1qye63niD6LDjnUI\nTRC9zvYOwurc8pIu1o9Q2FEhKsjC+F8SPix5SuqYB1MJO7rjAu1R8CyIm8o9\nP0vJ\r\n=EfuU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBwzjQuJ/8rlHrm1eApt3E0d0Ztm0bE//q/Kd1/MS909AiEA86DwgxaiyhUGZoJNa6th818DwAQl2dKntO5HeK3uZvI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190710113118_1562758378085_0.23908309506024916"},"_hasShrinkwrap":false},"0.1.20-master.20190710115808":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190710115808","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"^3.2.2","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9d19a9596e7fbcc0bbf39f4d63636b13351e3a35","_id":"@atomist/org-visualizer@0.1.20-master.20190710115808","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-WcxG8T2m7pamKbbvG0RRiPEIcmaBeuDP5LIOEJPCar9W+5I5puu3Q3Z02wkx1iofuQ9M4S4UW9VUEvAMMVJr+A==","shasum":"da74bd91158a2eb0bd99ba37f5b9ccc61cedd2fd","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190710115808.tgz","fileCount":219,"unpackedSize":3019993,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJdNQCRA9TVsSAnZWagAA9LEQAI0JqhUy5NVBbgnhPYRX\nYzELffQbOII5bXaLDnWbvhj/W/O5S1jSXpRGGIMNz5yKdHO4qqgFzUmrYCaA\n8HUFYSrBjF+OYcWA6Tb35ksMmsLE4klHrdu6uMvRUVWPAT158VWEGk++eJrB\n4vSwNNf6VmCbfvasTryRejd+Yjp1H3678KBefNuaoQBKskgYxScbaTzaoSJp\naavHdw5UQiXR5v6qjiq1N4njM9+d1kHskpKmmHEErAA9cLYW+pPB+ogXSITC\nlbj05Xg72gUvLt5V8Eh+F4Y+oebqMSgoG7/mWLjNFrG3lEbjOtdlgjLuyKfF\nvkRosVffPWoXumTGIFGxHbjsDtjhES+U8C8Zfa+fBI+9iFtKfoudNAvIIcJj\nGQKKF4FnnoCQxCHneYLd1f31cQv1981PELFerxnvdYTis7JsonrO1O/69HWu\nM+9HwQuoG6Rv6hiC6v2OmW9Z5l7MYCK+pLQAgAiMPZxWKwudIE75/xfKBtqh\na62pJXn7fBrF9KiTRsdSOeNI2NxpaM/5jv/qwG7SvtGQEsYK3M9LbJcByiHt\nv2uRX1KvXRF8aEjPOkDoWeMpU3X6AYsgg9pur3H5Z9jfdmwpfA89uKxvSUOQ\nL8JN2grt3M/gB7zhDrwbjLYBia7VWoEi+fNBwgIOLO1r2NvDptkYna0OPiXw\nw58p\r\n=0u7o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDKdgRhqktxkUxoXX11r/oBHWy9Qn8stO/ly3fKGEmiXAIhAKWW8u1hX42v9okjpF0oF1CUULXGq5a1eGt1FK7LTvE+"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190710115808_1562760015972_0.43714568083191674"},"_hasShrinkwrap":false},"0.1.20-entropy.20190710224424":{"name":"@atomist/org-visualizer","version":"0.1.20-entropy.20190710224424","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2e5c2926f043b4b22d62e8143d11dbcf7b5d7111","_id":"@atomist/org-visualizer@0.1.20-entropy.20190710224424","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-sl4hfP8YRKUO4AjvDWQ+bKNmSlQBPJp2v+4hNwmxf3GQCszUY6+7gdjADFWSuEmIa1Ob/NwzOt6inqn0HjzuLw==","shasum":"609f08e99a6e2d777987b9633b061eb40fef345e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-entropy.20190710224424.tgz","fileCount":219,"unpackedSize":3022378,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJms2CRA9TVsSAnZWagAAKMIP/216Q2gJq3Yv38gVKVT2\nhs91/wgywTjNCUY/4c0I9wE3cSLAnIs78EAVMUrPv5z6M71OiusCFbielT46\nlOlIUoYgp8f6P0nyrGqmsj/xwICFswz2NXiblGSqQEv2xLoa9IW5u/gBvrdP\n/gpsDlsAWXT/td3vDxIRWA/lcV8qsxo0UYV0PW/qii1JnS0tC7pZH4P/dK/6\nEgLAVsC+/DcSqJjgtooBZc6Q+cxg1J5Z+ElVJCxGss420Qq6EsgV5qf/FrDN\nllR3xcYBI//kJRrHb0RfprIaKjhoGnhpd26f569sUeA90aiOIwhOZziEZj3e\na3Wt33E3Fl7X86ZXHSipC9omoDhg7ivvlDPpAy13HGMwzBxfAplSkfRfniMg\n+4Q8Qe3w+ff6dUUBv3fmPb62VBFwd9JHD7Q5izF390Is0fFD6soJzxWcsy4u\nt7yzSHboQGL6igm1PG7aqgft/Xh4Vu6SnDH+yPhEEx/bGSlYffzbxXppaC4V\n672FjhLPBCSmoef5gXPETWogvtfXRPRFQx6xxR7SI4wf50KeTVv45e0aH6d9\ng5kadRVGPTvZzlZDgOpXe+jxsYPXC/IvHVtC8xeyO1TMk1Hx2TOsz8Fwfq/N\nCy5TzbJalSDTMeC++nzYhdnteKk12sNfDsYfPzYJ1WSRUvkD+hpZn2rIMUm3\ncp6A\r\n=veOP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGXU6jovMMLGGy4815EKfCtqMMxW/94hQu2GGHkHcUaNAiBmAjVbf1Kap/9sFUnWPCzYA1qeNziyFMxU24COP43bTA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-entropy.20190710224424_1562798901425_0.6267359307565448"},"_hasShrinkwrap":false},"0.1.20-master.20190710230428":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190710230428","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"^3.2.2","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"08d739bc358893731429635465b176d310914888","_id":"@atomist/org-visualizer@0.1.20-master.20190710230428","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-zrQ3YWbNKMGLbxuAxTg1XxMFAAQ1/KcVXvMMRqUU4q6eLUcqWBQ1eabaI5AsxTOVP/p+VDBKl9XWlwusEinmZQ==","shasum":"33631dfd6cc530afcb51c3126a81ac8f7f5a0eb8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190710230428.tgz","fileCount":219,"unpackedSize":3020137,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJm+uCRA9TVsSAnZWagAASNsP+wb/fk/45mC8v+gfpSkE\nk2R5v2yTi6Nr4iB+XYZPHNVnDOkhWonDHXR+EAHTmeGrWgWpBIVXIC+xGpkk\nGDcNNMPWy276Qt6TjmwbkPQBB99JZ/O2WEL/Qz199WKstpVy1fYmM/5Ejdkc\nhBpkhSqmP+JI7KmRdVAXc+wVyRmlMN7kiAL8MYvmgzO3FN1WlPBkg9fB+1Lo\nQMMevhRKR1Lf+562xjIyQxxVJRw3K1CNcJbI082FqVVwCIZ5f14GRCqn7iEU\nTv9uOrTB4twxurFW46P8zHtT1dhJEjivDAY80HPdMc93V96FbTBdJrwVVtsC\niz3bzj/ShEnrOPk2MbXeBe51Lv2XzdKg4vsplDYTnKsXBcHRowJl2UtaRqEs\nrGfZhVyLUzkQp/Hu/Etdtdr4pmTnffHtH/U1ENJrLd1dKiT5+ifMZ+Vfivbg\nXUmMsnrsn0MHuxPF8UAVg0eFaMNNpUvg8wEIbOQEZpDhm3xZr4fzLKygG6A4\nygeWk2dZvD+9dbVuaTPbYLQGEUUE9j5EtaFEu9LPJogQA2X+uf7yXJxz5HAD\n751IP35REN0/TflIN8NSg+UQu3M5tClKsZJLFNjC7Aygrfd8Sy8dl13QKRnu\naAkaiEkzax7Yr/OsVBZcjt+pOi9OSal9P4CkwRsSyKIcCoQ+014oWEGxCAYd\nc1ws\r\n=n2tX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDraJ4aE5KO5sNKMtnHb4ot9316AmzioLpvh625ZbgIqQIhAMqUpSV+rv65AElCyFK1UxPHRxwNgV4SNbEquvz2K47m"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190710230428_1562800045291_0.698202024320763"},"_hasShrinkwrap":false},"0.1.20-entropy.20190710235320":{"name":"@atomist/org-visualizer","version":"0.1.20-entropy.20190710235320","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9f50fe522f482e404b482f59cdffece5763e3d38","_id":"@atomist/org-visualizer@0.1.20-entropy.20190710235320","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7FFYJfWrphGEy+Xeg7q6INO6e4H5QMnwnhbpUMF9xcWqfrtoXKSTcg5PgB47NBPt1lLZfNYIErqOAs05bM3o0w==","shasum":"65be18af31e34745fc99b048fd7df566e36126f1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-entropy.20190710235320.tgz","fileCount":219,"unpackedSize":3022645,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJnrhCRA9TVsSAnZWagAAehUP/38YjdunkM5lGGGxxchq\nIgviBJSY8R9W+qnL4a59oFJVqkm79+XhXNjbivrDkW3OeMQc3/FCbaKYcS10\nP/v8t5PoHH+9Qyg1OaY8zxU9xpBdWciHTJnGZNC9TWb9tDC2tInVSpd/mSkO\n2ooeXWkylWEy82QZTaDk9ShfJ1Lub4VUCRKW3+T8CwmQGrTdHyuoSk+H2B0U\nMX4ZtGlWW3+WC0kkyIs8GCVB6Hv/3zZtQfwXIExgdZGarEhPMHAVZFOxyGGD\nXTng0SxBL7spMMVaMH+Jwlmp4RbmtpfGyq/j3t6/W0LamcYWEAHkNYVBCd5r\ngETxsKWRnfUWb28c0R2jyBUjdRL9HRHolol0bru4QKOPh/3wz0fYFsx7Njb8\nKzVa3c1bPdHFIf98lar4dHY8W6XUoSjLHZvz8JzcD9ELlPSlyQGAzOymJX+8\nzfm1aUIw8zk4y2H7PEDo+3Kjqjo7gm9vsjOsrNV+1n8S8Cv1X1QPxCRT2vdd\ncLtzYhEpL7LHoZIydN0UkZIBzcmJjQxJnoHJaOmpA3lUPsqGkAVRW+VyafX9\nBj9E77ZblqiueCTwF7aYxsrTeWA/Rc5Eh0jeXNo5vC4mttJU74Ph17aSreIo\nOjxWvoumpOnVVFfEAOtP20gZdLJvMOc6diXRHnnYjn+XWHHxiSC7XsTxDxfC\n546I\r\n=9Euy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID4EsrmGzKJHF61bemRt3d4zt/H9keUYHOnkTQ7vXKrwAiB+Ovj6ijjHCB+gdwXVjSa7H0RiGzxfSpV51tTEdGc5RA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-entropy.20190710235320_1562802913210_0.47472986993527666"},"_hasShrinkwrap":false},"0.1.20-entropy.20190711000135":{"name":"@atomist/org-visualizer","version":"0.1.20-entropy.20190711000135","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1756b3b45a9d599670d4504609a9b6476276a50d","_id":"@atomist/org-visualizer@0.1.20-entropy.20190711000135","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-PJ8KhjgkGin60er98RFCu4My+AOoqchC1j8f67LwewvYTZ9kHYtal2j07Pq8VFDFpaJq5UAB5rwQizn98Q4ruQ==","shasum":"aaf32f1fb73967871d843972a0f7100c08c7873b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-entropy.20190711000135.tgz","fileCount":219,"unpackedSize":3022924,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJnzSCRA9TVsSAnZWagAARTsP/jNbwxbHkJxLetw567rW\nvfRnadOCOe4oIMlWyVKldRMN6HgYLDre5SBSukaPrmpTvzhTpCVNu7cqFDH9\n2mDt3HtC53cYhFkcS/bsBSlDV9Xk8F+Lyw/DQQx8iarGbLEdzFYIs256AE8r\naP8/NAYFOGXWtKXa9+IUBwenIotKj3iATtOEdFAHrRXjIIdKX0VtDye9u01c\nR8VLUDv95+qgRXCmW9nXNNRaXJIaZFL3MYroes6ksA3H9TqrE/YUc7EkpCb7\nqZkhzQ6w4izKiSE2cAjQGrwwBz7V7EAQ0trU0AJDmrofjrbYTat118VYQX5Z\nxd47R9+XIb+6BKT8ictu8UjldvU603Ta59YnNcQIOQD/lTPaylKGeJEPw7Xr\ntDo9CIVFBlPe4jcEpjwvCuruzxlVKhBXYrxcHzQIIZRGAumFIloxl6v7pCBy\n8xZbUfv4tY+RiJ1o8Ba8eSvkcYMGg13JrOrOF0T0xJpjoT21qdUtBUeT8O5m\nbmV+/OyYRJamJqZI3plM7zu4vRpKoVW3W0lFpisNz9z5VbSuetfRwLySD165\nG7b9ypIj3/SyG1oVt5fmmyl27jhkx/j8JGvLCb/7GRLsxV+J2CDotrut28LH\noyA3/RABKCkDrUIkl+wfXKWzewg+KuFLM/HUXV+GTU2jONh3MKie3nMJCqCK\nshsz\r\n=f6j+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGsABCgomUfMihYgyc+aTAT+pBW+swBSsTP3lZGdIDBTAiEAxV32KGVSsr5JZzMK6cC1bnO4+C2nmoNywg3+5oE6EMQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-entropy.20190711000135_1562803409092_0.36783135438486214"},"_hasShrinkwrap":false},"0.1.20-entropy.20190711030959":{"name":"@atomist/org-visualizer","version":"0.1.20-entropy.20190711030959","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.1-master.20190704192303","@atomist/automation-client-ext-humio":"1.0.3-master.20190319172045","@atomist/clj-editors":"0.7.1-master.20190610013419","@atomist/sdm":"1.6.0-master.20190702114952","@atomist/sdm-core":"1.6.0-master.20190703071858","@atomist/sdm-pack-analysis":"1.1.0-master.20190701185534","@atomist/sdm-pack-analysis-node":"2.0.0-master.20190501154523","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.3","@atomist/sdm-pack-docker":"^2.0.0-ports.20190705091229","@atomist/sdm-pack-fingerprints":"^3.1.5-master.20190708032952","@atomist/sdm-pack-node":"1.1.0-master.20190523212312","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.0-master.20190429120158","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.1","@types/react":"^16.8.18","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.16.4","express-auth-parser":"^0.1.2","express-handlebars":"^3.0.2","fs-extra":"^8.0.0","helmet":"^3.18.0","lodash":"^4.17.11","node-fetch":"^2.3.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.13.2","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.6"},"devDependencies":{"@atomist/sdm-local":"1.0.9-master.20190604162557","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.2.0","tslint":"^5.17.0","typedoc":"^0.14.2","typescript":"^3.5.1"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"491e3249f7572195a4f1126d644d89829f50c300","_id":"@atomist/org-visualizer@0.1.20-entropy.20190711030959","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-1oVYfNCbjxuc6s3AZOwtwjtdz7M2k3+n7dWIMpyeUtc09UO0ghxUw8cMvQ/mQVf//JKN3Ow/U7NlBt2o7ixakA==","shasum":"6692e180013570d0303522b8af4a8932a2dc863a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-entropy.20190711030959.tgz","fileCount":219,"unpackedSize":3027788,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJqlhCRA9TVsSAnZWagAATQoP/1wGTijrx/89vC1SIO9s\nuowqXHhZ36NAfqSwaRZkEQLGUvoge6Qdya2DBrdPU3LnQHHQffcZB+upj/+U\ns4RdQtcaQ9zSeOb5R+yxXNJ25wa21aMofb0Oh7q3EkQM6VPcxK+N1gUZiWe7\nmfjLcPjFSKGvrf/27+IZ7+XYaVuc9i1ehv1rIXP0UcFFbbB8GofJSmcj70Jj\nVYDw5jaQ8IShzaKo1woDoHFkFtlJw/GVsrQLPaXi2StqKaHy8CDQDETlZqAX\nhGOeWtFbEfNz/IgErP1LwxklolREfWnczVOCGPUtwk08nh64odcr9okP5/po\nBJzXHudCkFpZ1B5HRZmKg5Bw2wi2JvjgCYsElKWPctFvB2tnEFRjmTuf0Mh/\nbi15Zv+rUjEgXdlP9ivZtOyvYwQIdKA7UogldUqHyVGDs52wNz8rt+ei5oQ4\nAuGzThCbsmsAYBCi6lXX/KwmjDgCKfF4U1YDdZneMJ7UxuW+KOhFmav9KFRA\nCfjX3YA7M9xbgAOiV6ATn/ZYWOXxsz4HxHzUAA0NHuOVlAIFMK7KOsBbSr5g\nmrlGKpDyPzWhXIpBgdlp2s3hW1/vfGRFgHPEBjOHShz55Sy/EUROqg1qMNGg\nOwrdZE00lbq+4EclKR9Crp2mT0169sibYpL4JEH6oziUqZHX96gWaLpV+IEe\nz6/P\r\n=Oom5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCqI4R0eKl+0WRfwuv218+M4B74Dc2JWWfyEZdYJqKnDgIgQguaoPkIhUBPtx3gjgTNDrmhMYjX/uPDtZdV6YANdYE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-entropy.20190711030959_1562814817093_0.12936947505316287"},"_hasShrinkwrap":false},"0.1.20-master.20190711064510":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190711064510","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"^3.2.2","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7194c8a1ad9666ad1aefde562dc54efaf466d20c","_id":"@atomist/org-visualizer@0.1.20-master.20190711064510","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-2PTcUunhHvGJ1/PkvaJL1MaHe5RFN57eWv2ceXovkRyb3H8gcFW0cJGkEZWJDQ+o7/G2ByF7LLhbRAlX4i0I9w==","shasum":"e6784a12749570297a8713fd40d9b157a7c650d6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190711064510.tgz","fileCount":219,"unpackedSize":3030194,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJttkCRA9TVsSAnZWagAA2jQP/1xt4uPCaB93iEDXOVMY\nk6eQtj6JP+AtKywO+vr4cD1CEoN+Hfkip9OH0f6p/GfEtBEOa45L1IMe9i+E\ncUTejhOOmfFL5mWzaqwpCgUgo68Z911PihREzmeU8H3i3oAYMyLGggDmjShV\nRrN0ytyMK5D5R+z+A0CFVefuM0tI6WM9d4RgyktYEfDJWdzeKFhS6oYgAONG\nhQ5Dzidmy4eb8G0za8AeegH9tFxHXVWdzcYrPIMMF2a3xi3VjhXjjuVck5Tm\nRWpeesWrgniI5WoN3zeJnm/H4RQWn8q3XSTeqBb+Mwprr7IriaFo66iBA2wn\n2+Ht2RFiI/xYN7h+sY4OzIxllL5EYK8F9j65Prjq02aG2ofeh1DZieW9v2qQ\nxMAWjGqHyNgkWFWb0yMdPso7Qm2f7zPOhae5mcn6WBeBOffi4eNCUykuxCB7\n6Fytp14eDf1eELNcQWA0DhQliIYvTswkwU4vObeOWXvIC3wuHItYpkK+i/wp\nELIogaQxsxYPXcQLt8AOonld4CLdwJMXIuStqUtBRutHYRxIZdYMk58QGela\n1o3O2ISft4TE0MYsqRdAs5yYwDw0R7QDj03psZbXOp0XskA+2Px1d+44peoS\nQdu3dd3rKEicBf9OAhrRsEyfzE1VI2vt/+cWscqaYNwlvrOcc9EAd3O+iERj\nDk44\r\n=SsKm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGvltnk6vWqdF02JAUkrFkI4NOJUiZLixrwIa6jWDCyBAiAHWDZNb8SA0qP5tNtmwjrQOqA2mOmLi+ApK8rkRF1Tqg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190711064510_1562827619134_0.5221600640261239"},"_hasShrinkwrap":false},"0.1.20-master.20190711070314":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190711070314","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"^3.2.2","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d18e7f9564f3ea1c73d6dde886c24815f52d3e63","_id":"@atomist/org-visualizer@0.1.20-master.20190711070314","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-fs3Id0iVx4GkqmPPAmn9164MVr4kfr4NvTjLGVZc5egOl85IsHNCCyjg7MobDxK/iOOv4A7D4r3V/Rh3G3bv3g==","shasum":"a6df08445706066cc45b3c24a0d2f5a449324c58","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190711070314.tgz","fileCount":219,"unpackedSize":3029253,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJt+fCRA9TVsSAnZWagAAIiEP/2lgFAEkqGKn/zkP0Vl0\nMC3PmUKvQlkGTkmzM7eUCAeHrpjxVMQ/vDIP3eTXW1bSPKM6Y2Qs4LDcVUKP\nLQOX+cp6g6dyn4/HiPtw528GL4FnGDwyYewk7KN42P4Q+RFDVBkNFVZpmRNq\nvr0PH6VVgaIPEUTkG4enwelZ1cxXsB2b/sFO0NxN2xg55K/EkipREk4gs5H4\n7DFOLFHF6romk/olhYUASC9sLbUAcRsJov/pgp3qtgOheU2Byp5SQp7oiKEK\ng1eyPrYMpx62ZUXKDaqkX0UrfV7FMiVu1F7+fWK4+m8vSA/dV9YNZg+g7/2h\n5BVEFum1XbQnkuZMlqJXyUUGIBMZ49zYNdiyQyB+WbjxmYUm9qcObLigGS76\nTk8vaGLU4dMDQa8/oGdkQiAuxRmJaCd4xb3YlcZlhpTlxAjj4Fjbi+2qE1Hy\nZggRfVU7+igIQWjIOSt7g7mc6hObYwNuWUzpG3ziM1x/qjc1pSVuxQB8B09B\n4VnNn0Vc3y5rGuRarZCY+ijwRHrIAV6kzwqG2zQX1NFw38rTP3Cw3Xtj0pQx\nOFJNI2vY0CqQhk8ppw5Nh2T8OxXtaAnN/WHCy7us3S266DbdDtXLIvKrSNVB\nQwMlHCF4grjJ5dANpy0nTnbfhaDzx6CU36AynTialLikBuNMpSAV3igVQ/QN\nOM/M\r\n=FXq5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8l4zF2Jm2EN9KjGYPlvgLn++51RdVsNXUyXSrlRo3KgIgOSO/jStF1KotbE9sujnz0LbSlzfATbnhjsyIwJDZAak="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190711070314_1562828702914_0.694933096448417"},"_hasShrinkwrap":false},"0.1.20-master.20190711071345":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190711071345","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"^3.2.2","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e354cf458e78fa34c8f06f6691e97d1d22662fb6","_id":"@atomist/org-visualizer@0.1.20-master.20190711071345","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-9pXQFNMcay0Nkeny9Ijapm3ink5oW8vswLi9hoXppFggkeay3bXOtTl05XeNk53X1yrFl21j8wBTl3yCfCD5wg==","shasum":"2c34298a79b038c3320fbda810daa3d3481725c8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190711071345.tgz","fileCount":219,"unpackedSize":3029252,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJuIZCRA9TVsSAnZWagAA89kP/jmtdOuzUoyDiwz594xo\n8vjh1/9uNNaJ6WBr2+O7SfwP9tgnR7NbUJDVvBaCANiFxPKNsdk/9oi9iOwa\n/nMcvGuv6DkG+hAX108GX7fRuv7DV9v5XCsopL0YTqZGm+D4ZS3PO7dtGQb7\nugdrZnqJda48dj599n/xSf6o07LXeboHgVRblQkhw/yTHSJGCppVJk+bYlWI\nP75gfbR0zjmLF8ONI7bkylPhkvRPIDY+UILzWuwhGGlWPrJhwZCOPWY9rSJd\nOLrXWaQ6Yba/vgmwOlJIDaUsZobVrNyySpJbWaFD03jU3N1v+4dD3rK163FU\ngCLWOdew6f8NJWzo6YPou0/9eHMfNKRIxDcvuUbom/tNQACpybP4cV6SGVfN\n/Jes0OkXeCO2IrCAwReTPRKcdtzfQftsXxo+G2LVWnKA4ePSWWyHv4c1IeIN\nEOSHI3z8a7NeU/Z3vjyKc3srUbUlaoXgTeVj2+jIhd+LPXtww1iXzsgTpI69\nQ2pM7atn70oo8HsfttMr2Smj4m+5wuZ2PT1XJ1CYUj13xa1y6/dK6IGVTFTO\n527TjJAgvpK6rrxElXBIEF/yLXwC76HOcw0Pehw7KIqdJ4r70mZviiLJ8GSU\nD9L3Zt8+h+wbaPu7mYU6iw7pduU9T24MdrFgzxcO8IzM2A0cieuOmI8EnGCw\nMKwe\r\n=k6D0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIENJOYpmrSXOYf1Ci0kxQmxrcEQFiIVydUQ1dL5fuxLCAiAl0WIPgXM3vDvOEGL5hpITjwuCdG7mIIfl2Z7VXNZt7A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190711071345_1562829336024_0.9060169569712657"},"_hasShrinkwrap":false},"0.1.20-master.20190711080253":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190711080253","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"^3.2.2","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cb2d6398e26d423f5f2286522dad5eb34348391b","_id":"@atomist/org-visualizer@0.1.20-master.20190711080253","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-StyZuNlj5+2FLaIobKoowCW9qAQUl1El63uPJB0x1GgqAKJuopzl8fdkLOBNompC09HduWayTo9Baw1rBdR2HQ==","shasum":"450288302ee196c26266795a10363300baf9ae1b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190711080253.tgz","fileCount":219,"unpackedSize":3031696,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJu3CCRA9TVsSAnZWagAAmAwP/Ra+el8nADXQ1+gXe2i+\nyRJ6C3edwjs+Cf7K6leuAB85NpgQxnfa+qRy47hPQLu0ZhO76unZweUaJ0Ef\nFTLDBwVYs9tHhQT86jGYsUTvTIli4ijFTDKPf0AM5lgWhgU5G82BEDs8EENU\ntKvW1y6ISmHHNOzWZxkZuckU25w1zBum7KuiYrDcymzWXzUvCgFbaXrTTzmL\nWeaFXkYIs0C35Uj8qxmgmTwgX9JgKwgMTVC/W9CiWpe85XUs9ETSglN8fyb+\nMabT/zJ3qCPvvypsCSb9DZ2uoP/Ieznyp8frKszwfj24hxgcIp41LifxN8Ky\nShb3nrRmQmfJYMil+TFoETpgR5og0oLYGW7CKQwx3YEp2IfPqI/6q7aNcGgk\nCLpUUUd3XhClxQuZoo5xy7A9DMR1l8iTuFxFRb00C7W38pFmnG6QLGr6MWGr\nz0BW/siPgKnvvL3+6luilM6CJ3xY9zQo/bhiASqbV97lfnCcIaaKF3+5IZO/\nY7fb01KhzMm4v+zJXEqQDXbndJ4XaH/tSdmbjlWK7ATv1aCg5jouuR0Qumpp\nluP5pXWAoWf+8+fgiJRCtQrzNjq9hloZzNdPRc6s4RebPM58l4n0ZTWP1pT5\n6aBjEm4Dg8wZ6hZc0VEkdJcLs192+g07SXpBljGG+ZyEzhRqDSa1yZ9VbZx1\naqPn\r\n=Z+OO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE1RHHtWzeGOBog0KOyTWQ8n/zR6aGzV9yISZ0u+jbTkAiAZ+6whoEvcWdnOmbNEOzfKYhIo/OS1aSf+5czqBf445g=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190711080253_1562832321171_0.40332178241456385"},"_hasShrinkwrap":false},"0.1.20-master.20190711104845":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190711104845","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"^3.2.2","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cb3f13b49a6fa1986cfae56ce2a65f54b3b27fd1","_id":"@atomist/org-visualizer@0.1.20-master.20190711104845","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-+cd5Go8yu51fxCxSqei6WfAt2ydRstpMK66E+cKZQXexWjFuq4QnfIrhy01LrSUY355QHy2RJzU3V33JICbKdg==","shasum":"b23acb11bb8e5ce2b6672ba08227a0eaa2ef2d17","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190711104845.tgz","fileCount":220,"unpackedSize":3081333,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJxS1CRA9TVsSAnZWagAAAsEQAJ5l340cKUnJN5OXEn9M\nC5otKgjtPs826MzRjF/uMcCeyjtTsi7gLdTcdZBAoR9l+SAaFCfwDYEtcJZV\n+/jewoyojgtNmmIDxEfE5wOzter95TuCDZnWzklfaQdjIjziIFtiBXx6KTCy\n21UVy0Gw4vXkhkDQIJlkTb6iCon84bdw9qrHTqKFdmpeE/MzQvEOvZxMXWa/\niIJ2D2p1K7npYTYcdfJ02Pv0wS943NWCA1pxBtUB1ch+osBr2CRDXRBUJtE3\n0SyPyjiG/Aj1cI/Q9V2Qc4dHgxXesTdMY07uE8VpYAEJXwBhbVa5xbWc0OuO\nhcaflXiKC+ntdWRhPfoC5rlQMdyai3ilKefhIzNUOw1k2Ci/UG9sVEVcPnUJ\nOiyQ1OpTWbapCKtFCq/I4FPM8NoForKSngVHZYqNkZ6lyLvihMRES5AzbaKx\nxDvejePzJSyS/HbuMCsbldFqpOL/RWhZX0Lq8wEzwo3bxZ0cE1twcsMsWe0n\nbnNKtFwyzcHBb7YG7ktXa8+Hn5kuvPPrZO7gyPN3tuUfTkxrMrv9ePFji2uy\nE0D9JAsu+sundyGI3DEMtYiLecuwTqO36eHN4xj0uiO12rV3IG6So8JrmTBc\nRrPKWrGM7VFJXSaEj5NLR0YzHXn3pWYOnEp9WahBzGLNRqZBkuOPi3Js9rti\nvpu4\r\n=UGLY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICmci392r+wSLcaV/s99C6PJVgNaLW+w168iBwJkIfjGAiASo+D1VxZRpUqbNstSINPrarJVjPkED7ug6/oV5UY+5w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190711104845_1562842292509_0.31904135922086163"},"_hasShrinkwrap":false},"0.1.20-master.20190711203158":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190711203158","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"^3.2.2","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"86522aed3346bd4c041871b07a4ca1f73a9777f3","_id":"@atomist/org-visualizer@0.1.20-master.20190711203158","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-xMiyeCdjP4N9Mp6lKjpZPrwoBhw8tBE8cu0DA/p2UU9LBipAnocsYZt4HnJAh7cIfjF9QxI/+GyG60WbxA876Q==","shasum":"4d09e3b184b3abb16469d96c5c904b6454b494a0","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190711203158.tgz","fileCount":220,"unpackedSize":3085012,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJ52LCRA9TVsSAnZWagAAdBQQAJqF+ypzhL+zc/M1iCUh\nDCOZgxdAGOBK7cOSZ/Md2BpLk59htoml/vSGl11SWVW+cOP+ZBDfS8dhnoag\nXRTsgJe0JmfPWd2/I/KODB9yLxrqzbsib9NxHf5fAgs9Krt5EwmrasrxErEt\n2v5Lf59rtsNSbaTO9ZnlQ6IqyCn2ZsCKRJE0O2bsbkiQ2CaIsh50y0ZeZgLz\ny0/9LazZ06LyXFsYJN1mN5hNigN+ZWQMTENDV+Zw72IX4fdqLsCSGjIKA2AD\ns3U1D6npyAL4AV6Y9wTDzFAlQTd0vhfmSDMyu4kkA1lv0n2ynxIJRGdwNbIc\n670fCqKLQKYS7hA9jq3NeUbEb8PoKGJQJYi2I+C9lkbRtDLK1kVTyvJjCYId\nFlDhnEy/I8PyoYje81C+Yk/AIIosgIpEhqXH+u7dbWFRaTzUMHDmRir5akor\nhpvtmlDfSDZt7/kXdT7vPu/XnhTP2koPs7rbjsmBR+Qea4XG4Z9gc0/TejuG\nGMb0MvVWADfxIfg8Xg7LVALx9K7yiYnA8S6/tE+UFyhAUB6Oh5/pqMcaXOtF\nR5mvS94CmvQwdVJpdKWDmycrv09qK6kPNExnevTco0Z99p9o0vGVJiljV50r\nnno9/lOenNH1uia0bafWLOfZwG/7xLsjb96tDwQsKEaQRI8xkJqAHXOTy+Sp\nt/eX\r\n=32nw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFoVpqYNwVJ/BE7qO1BLAqAE3sQts3ji7MGV0zJCL8bmAiAtrxJN9dnm2wcq6Uk8fdhXmCqL+4hqLMSZxSrzFlg8kQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190711203158_1562877322985_0.7350535690247613"},"_hasShrinkwrap":false},"0.1.20-master.20190711205804":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190711205804","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"^3.2.2","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7a0b4411b864720ed326499958e2d71265f13d41","_id":"@atomist/org-visualizer@0.1.20-master.20190711205804","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-PMUQ1t+oUG7N47cI5veXn8Fy0L3RYu08QAT45ekOWOeVhUn5sV1D8PcGDi5LEWdntXcwNtng0iXfjHurSOKrWQ==","shasum":"b0ee7dec62167f8095f42d9826e92dc55e0a2bb9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190711205804.tgz","fileCount":220,"unpackedSize":3085342,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJ6NMCRA9TVsSAnZWagAAFFEP/1kWn9471G3yv7BCUh8K\n0Xfo3XbM4cokX3+ktq2elJbh7g2/V614cgYwk2AvcubKfz177nTAl38U+ydq\nXG8bVgSEtowokXBbgagoRfwGV9WZvUDKn2I0sVEz0m64Sz2ns9KCbVSXVNYZ\nJvXtLErdiZfTIL4o747V/qbH/ABdoXqpMP+xQxX6/XbSMBCsNQXTCuR6YOvU\nvwB2PJBMh03Z2+daDWvbxQIjhYVyyXiyXZ6QVlqQUUF1jThvcluY+2/droom\nDofCQFpqwCkDusLSn4pvj9Ev27uD4Aqh88bTTwtcsozPRTIEnbUxDZdri60V\nPfyNP/pmKQMUZNBgyhZsH1JcgWdtnfTXNO3wizu7kU3rpJiPxN/v66Dt9YWX\nuEM6SeEnGIRPVSUx6XnZ+OZj8Uaprycoo+gPtefF1yZqL2GL2C0STwCn9X1w\nZxB7VY6D4OKA1Qj9W1t8lnT1N/V1wyP0NMNKMeYsqGvfNl6wKL87hV8YM6d7\niFrPcRbUSCz83dPYIR6ak/ThB0+3Mk8yvBWv3IH2VPkMv9dpmxWF1vnR9zPV\nXEMSPIoumvWCm7o1+QJTFBRc7tTI5Toc2O5xlkhwVm5R8Dfsqc8kQQdydPqk\nXbyjS+d/j57cMdV9XNeO/EtMZcKcrnw/3YaMXUsVcyV5SmTFm0VB5OLCNV2w\nAdox\r\n=C2jN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC1ZRdi9/yCKV5iTcEp9EEzFdr+4Q7nv4h3ZVTaPeoWqAIgUR0bEzYHm8VZ6YLXwjQwqaYVjxpj2zHBwQtBVvmHZL0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190711205804_1562878795603_0.8654476963558455"},"_hasShrinkwrap":false},"0.1.20-master.20190711211457":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190711211457","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"^3.2.2","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cc6b2ff942fd3ab0429fd654042a1040d600d03d","_id":"@atomist/org-visualizer@0.1.20-master.20190711211457","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-eTCejoc1xJsoPXxcmm0JhRBGdkdQgHowFCnUMvtzFMSgX2WfxhVnuPxpy+PKEJlM7Gs0t7BO2jrJQL/9Jc2ebg==","shasum":"3a9547a4c77e125af705f946d2645e073ea8facd","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190711211457.tgz","fileCount":220,"unpackedSize":3085392,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJ6c7CRA9TVsSAnZWagAA1N8P/jmzxvv4MF9w4/uRxSfc\nv8PjE1a7ET/eHY90J747i+oiLg9r0m15cMH3+HJ+SD0/T1nnvVyYEqNZRnda\nfzUj0WSP4dGsKGdck310ER2cPyGKrVYV4l3WAMDK3dEKLh65bs7YCmbjYVPI\n/AZ6Jmz5yFQ39c6RYRlf80xnvD5L5Bto86cfOQnnELyZLwXvKOPknrVLqZQl\nnEzC6gXGQXZz/ylBJWK1UOaf6ukheYk8bMtngUXFgg2rmNMIhSfq7Iwgh8Ar\nRyrM8h0BCPOI8tSLaX2+FtR1NhfhcjKTwT7sHagvEX7rOsis5MMRosLHHAGm\nB0kzu520mQmIriknibHF4tJoPVBzJL2pM4z/j4YEgx9DLbZuNmUB4Q8kJ/rH\nU1MwyhyGyi/1t3g9uYMZlqZQwlQUf8y8LzMG7sWVLZHO7yPf7ziwfcJUHhLb\nVVdG9eXDQ69XxYbkmuyRBjjP5dojWZzLB197U1OViA1fpEpkjx66SgZgUdCG\nBe+m1UtVyCsee2SjXEFxuqw/ce5sDxi7wvEmCzU1Ox7YoJ6vD3GirCFiUpAp\npvvr/WpJ0yDoP9nafch6ob0Wcm4hp2yfIhmlsRqkUmVQOCDTUUbjhv+wSQrh\nIFrnp8kCamgP8pzFGWNMjVowZeurBBQjBpk7P9PsCo8pfGHQz2mMCfusJXq8\nm0e2\r\n=5fYZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFZD/YX9h9lGymIpwplIVA+h5o1IFmdVYVbaFOc6kp0BAiEArVXcCNrvAvOdY4iivYEncvqOJUGnkntuTWCx+ifEF4c="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190711211457_1562879802544_0.11827036916409073"},"_hasShrinkwrap":false},"0.1.20-master.20190712013513":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190712013513","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"^3.2.2","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"aa17e179e2ff0fdfb0e8beb98641ff295c5339a7","_id":"@atomist/org-visualizer@0.1.20-master.20190712013513","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-U5gQijdkQYx5YYgVXof7uPuzi+SIdTXlnipgAjFsCeUyim2q7vtOv9URUqxEup1p8I05Ikvm3re0YW0ZIEnELg==","shasum":"82329c505bb404f9c0348553941517f0fb0dd037","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190712013513.tgz","fileCount":217,"unpackedSize":3077243,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJ+RoCRA9TVsSAnZWagAAZlAP/iG1pGRg10YWgqjJULpJ\nos5xsTl6v1Zt+93W7LY7enyMMaEdidIkyEMwdT8Jyak426qIPr9wOmwYSmdy\nYktW138nx/LAI75uwXmYqLuZaHJC4DNXlyAapQ9q8uDTpJBNQisPW3hwioKh\ngifeY66muO4/luy6fIlws4vzrmAqQK6wNUIY8PmDTBNXHGjv+jqZ4ER97gyf\n35BEXCnEljhjfwn93J35UmQgrCeMYUg+unk1RWHKhp06Duzal+FOxm/EgesI\nerpEvKD2NAzgj/RXOCCrrGpmEQwuygG1F5dl6wfrxSjC2Vz6cBvJuyGrEHgV\npz9K+ALt7RDt/N3qbMGMBQydvxC1xPoUl+LDWlHP4iCzx3emDWqIW1dUpzz5\nTnSkOgHirx0/BHJzfHO4pmn4Tkf00Jx9R8wfXg+gYYRUkip8ui9ZCEUQGW4j\nqx1ZUMgjKvqColVf+HdidRBCF5dhiFAcefx+0/5YBxr00rfe/OGkxkRL6tHm\njLPuCok9ua904hC+KP6tMfZUV5b68VArn/4ANylvBggJqhfMTjsYr+7ah/8g\nNgjYcq59H8TuTP0Es8riz6hU1/ZkhBbOcQNfKo8kYAiE6arQUNVQFMtqSyX/\ni0KuzdGIBelZ/CWx2K2gF4U7HzszMurjKVupPskuiMI8axIUyqiOinVf8UKO\nYUWW\r\n=QynS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDUgbfql0xQxC9l7uPsOyS2qBVraoiqEOZPBF0I+8jNBgIgJ6WnDdPsfucjc0hUL2rPx99qkMJNlrDMp09YfDySxUg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190712013513_1562895463315_0.5942220206283919"},"_hasShrinkwrap":false},"0.1.20-master.20190712055626":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190712055626","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d4d8d55172e5f8784b775cd243c2dbb2594ae03a","_id":"@atomist/org-visualizer@0.1.20-master.20190712055626","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-LXHZH4SimSOAHZ7fJ5wLgmQmAf//zbO8+5ltN6R7OMMzal2eWvEXShK6i1ayRPA23G/axhtJfg0wI+7XzNlUsw==","shasum":"13b5ef5f349a2012cfb4b301461cc86d9e70842d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190712055626.tgz","fileCount":217,"unpackedSize":3073960,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKCGSCRA9TVsSAnZWagAAdOMP/3oNe6SC4y0oYEKvkuXG\nqNmo2KApH7w15TERjLAv/XyjkuC3fHBiDCsBhxOV5G61057KK1XK6Sz9dhAI\nIC2jMzaZdSWFom1GIa6mKVDuvTyeV3kUXgZVnzZyrmDE+gCdFLCvJfuioHAM\nnWtDor9ItQwh5xGROfvgF2kOjuWeUuW1H87DLEjYX3IvU+lH4/s+RCvam1Xs\nTZwDC2B3DgbxTdLTwyOFxBtBJ1zrM45STHCOfwTlMpYBPtTdVrrIfeXtTdNT\nFd+ZD0dpFNE/uk/Yw6gdnlEt2EZJa5Xl0bKFgRYfqKxWBNYz+Opvkjgjh5By\nIsNe/yMqjdPdzXNOiU23mm1ElXr3Eh5UdvtUEGm9GfuvhfRAAH1BmvAFvdMm\nroTdr+oAk9VPzAYNpmC52XiBF7qIwIOQCKg5KCrWmjO+oAsoWIjA5TVWQKpj\nNzC3DSQFM53m59079ee3wRcGleEe7RmCDyzap9Jt43tkoeeNtuKxxcJ6/6W3\nI4aCrsAIuylUXklMVdcxuUCAQ8XXhU2tkeqBl46cUWlsVMb/REbaWQKpJpWC\nMVY8ifWrZ5eIeS2LeDrCsy00lSQGs3oZiDOpvv+/hjgmNztRprNk4e6T3Off\nbtK91fMfVfFkaR5uOrAxTnFXe4tvKbTsPqCTG3ie9u2DPzzTaBO3UAgptXG/\nMJ59\r\n=WitD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDBunYhDjcE1dwAY0141hqkpZ96kcjz//mdPYYXTKaPbAiEAwppfNPp+OTO7yOQ9eri29sAGLUK8o5Q9Yo78ffsiCVg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190712055626_1562911121949_0.9246957200534822"},"_hasShrinkwrap":false},"0.1.20-master.20190712073911":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190712073911","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d361462210ddc05163e1777a16f940f363f93342","_id":"@atomist/org-visualizer@0.1.20-master.20190712073911","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-5apW9zfVlLg38XWQlNlNgHwh5250JiTn1Ijr8CTRtgexf+mEwVE1F37QVfZYlDmdn2ScQQJA2PhO6Z4keP0CLQ==","shasum":"53034a194428bb1280c2695a5eb3c4ce565b9a70","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190712073911.tgz","fileCount":217,"unpackedSize":3071282,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKDl8CRA9TVsSAnZWagAAPOMP/j9tbRhuUkGHV2HwITE4\n1n3680wmKM09g5YrxpDMWJ5BugEkKFEnueUKArylSoHxDcrOgdWAhROI1hAN\n/xX5JD1qWbzOh+DUB6+CjmFXLM3xL2d+lc/ps7qa/SEwGFPKewCwwjIBaEXv\nVUp3l5PysqBajIQYTbF8uIg58Jcwd9J8XDw9Y0qYPLsYf7TuoUxlRIHJBFyB\nD9gV4JIU9NuMHJDv5/Q4+yrqHeU/DoGNWyOKA8xs9Wim4hXMlCuit26zwEnH\ncQeLUWAwCM1IY439bsAQT0d+d8u9WmaV1FyCBWo2iHl21ia/FRiCDVNDPh0c\nnj5o71YNywdYvZW2ZoyEAhvmV/Q/5xpNegFsjfMf7vP60ZMvMXqnLxIXa5MJ\nf0gaTozTe3qJFP1Y6dH9RXFVNdEtWRIuhKDUtMyilZa5C/LMYgoxFgm6D6iW\nLpzpkenXY9/BPCx0AF5k/vUqONwYU3ACtMsAdMHWUTXrNVKnzhxmsxDVz7ru\nf9BYKASampGrMjDO/vKl6qCnkGr9kORBkX63GlnvFh7IPq1AtiqaN9hc7IKU\nAl5UB4rckI000v87jDaPBE2t46eoRRHh9VPqVbLFnXfJ92WaN5mz5JqE5w8t\nDCqzzb/K6Das9/JtLsVHFeC7sXSD+lgsNVll8ZhFDLaNWq1mlGIjj31TU2Wk\nmYE6\r\n=NbCD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDqgQGSTZE5jP3mSVmulbOENMyJd4Xpog9gEaVOcJTJMAIgUaD+1kO8mrdB2uoj+F66ELdMlS08Yn9NQcWS79ZDMLs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190712073911_1562917244141_0.3072661841970299"},"_hasShrinkwrap":false},"0.1.20-master.20190712080607":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190712080607","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d7f6a70a13357ae5c27e3b9cb86cad67e0bb0be0","_id":"@atomist/org-visualizer@0.1.20-master.20190712080607","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-WykV6P2LRBU2Kp2jL8tOiLJRADe2HjhsuLX2kQ+2PM6snzUBrQ0lweFzl06wYuRTZKC3S9FZWdFppvr5s+wFJg==","shasum":"360518858208d4c77bf19da121344deff06cfc41","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190712080607.tgz","fileCount":217,"unpackedSize":3071775,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKEAMCRA9TVsSAnZWagAACWYP/jH8PxH4+svCfMc18MC8\nmxYAVohgZqNnBoQyZn7wUThULpODn545LeOq2E4PV6JvZKyx1cMwcNrCY2ob\n3E7rYn7stCc9dbiW3xwrPKHJ2fRC2blFd+jaNJDmteZ4EzsA9QwTJzbQUoBw\ndKRpmZ0nhvnnDjdDzwMxh5WmEy0WbVsHBFeKYGaBR8w3huVj1I7BfdEzN+WE\nw27kEQj4n/rFjTcmXZawxkcDVlh122dSOtI3JhggBb5I1CBzGO77PUr4TiMS\nAw909mnViQi+5d0XOfobg/ZuHuWGR4Eb8cSIHUyzvinxp9/OZS4TmK2OtQ0O\nMsKWcu01Q7WFIkJS975s6wP8zfEzsoGH0IFNK/S7JUYhKGiCdacgoq5oWzwf\n65l0zVoUNAXMa4Rs7wscY30IGOefyKzJI9pQhE+YW2r4W6En0DuSZ1ou1ne6\nBMR4o3Ky/x5uE4MhJ2KvxbZAuZ9KDP7pey5BQSJrFLGnUMcB+88Wh2fzM0TK\ncUkKu/Z75BzM8ZcXBIXHvCp3BGvotn3q49GZXee6LpMl5WWg7e8CXI1Pmstv\nZ8fNHYK94xXfIzI5CRVKWDIwKdC/uRStNDlliPPu5myPOB6lBo2w7/rbPoQz\n2baJl8VbH34v2isY/VmvbmdhxyHF/t5NqT2/Jytqm2hEzakxX9tG6eu1UJjb\n4z35\r\n=k0rP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHuCd1lSTe/W4fCxfg93li4NcPETeu/gGYkq8CMP4UA0AiEAyU3aATClTju/0iK6NX/PQLVuHWE8IRFWvEmaRC+b3KU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190712080607_1562918923566_0.43466242250800136"},"_hasShrinkwrap":false},"0.1.20-master.20190712133258":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190712133258","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nExtensible, with out of the box\nsupport for the following queries:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nPlease use Node 10+.\n\nFirst, install with `npm i`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to create the `spider` binary.\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org-viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n\t- A JDK (*not* a JRE)\n\t- \tMaven - `mvn` must be on the path. \n- Node\n- npm\n\n _All artifacts referenced in Maven or Node projects must be accessible when the spider runs_. Check by manually running `mvn` or `npm` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable. (This will\nnever be sent to Atomist.)_\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/ --u\n```\n\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Features](https://github.com/atomist/sdm-pack-fingerprints/blob/95f2213759de26e6fe6a6e78edff8b36fa357f08/lib/machine/Feature.ts#L131) from [@atomist/sdm-pack-fingerprints](https://github.com/atomist/sdm-pack-fingerprints). This also extends to the project analysis framework, from [@atomist/sdm-pack-analysis](https://github.com/atomist/sdm-pack-analysis). Scanners extract data\n2. **Query** functionality.\n3. Simple **UI** using React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known features but it is intended for you to add your own.\n\nDo this by updating the `features` constant defined in the `features.ts` file. Simply add features to this array:\n\n```typescript\nexport const features: ManagedFeature[] = [\n    DockerFrom,\n    new TypeScriptVersionFeature(),\n    //... add your features here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible features by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"aff27e8f1874b0a523cca2f0bc760e06b62b372b","_id":"@atomist/org-visualizer@0.1.20-master.20190712133258","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-AG8BtArFvRoLeGITd7+eRG7kHCftaAe99djNHwzltUXhV2M5p0diP8us7Yme9XJwe/jQoluTHJfqc7iJoE7z1A==","shasum":"efc58a2d6224f999683f10f7dabb155effd0adec","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190712133258.tgz","fileCount":214,"unpackedSize":3071768,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKIx4CRA9TVsSAnZWagAAakAP+wSQ7A5zcL2oDsVhlbrq\nbGcwLT4TjPcpVd7F+46J+t0Lw41DGSAv8JM/LacHPjExNjUp/lqxS0m/1VYq\nqxyMgJXwqG/jm6XT/fn2tENye9D/XLwJ8Kl2wgMszCxbPSglubstxo1rax4I\nflhkwjVUfHG1HvBTxovDMqMPaMiwHIQToZNJ6eh8jBfItaNbnFlcXHZXIuUR\n0843Qrsd/qU1w30gYeig8bb8dj/kwBrSaYXDdEyDLCiOId+VeovYahwMjcuY\nI86zeWlkR5KBzylYid9g065Qemzb9t+96bGEhMMC3A0E3abSLbYh+yRT+Qnd\nhjbzFpFbXsbuPnRk9Jbj5fzAHKMBhfn7jXoljd7FvjtAdT7JHx+EmqhbBbp2\nREu1RYFggeS42t5+ZEjnKUc5SQgVoXJTaSw4cgho6WhcOHSh1gCqvMZhwc3l\nUpPBRdj4F5Ox33JjC/59ca+wRR4e4R7CXvifS71yAiPkkESoVDaQrfsZX7vK\nAfkGyoAE13XWOnirvKO4oAPC7HNDy4HRpGLxvv7WYTh+B1y2Gf1w7JQn5lMm\nvaxXjuQFZjMqcPWJBlu4qjrhPvyhKg4NbjKFgPwXvS+DDo+u11ICTWGPkvfU\nFl5B2NtnhcbDHv2sgFQcs77rM66NPiPBeAtvJDy+PtXb22L0PioKrzsvgMw0\nPhz6\r\n=7Jgb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG5f7ik4vpUq+Zvsqn+XRyqD9e/mpK7bKH6R4iQyKUmHAiBnH9ibKNnRlzXOqJEX+gvilZqJXhe5ZIUuUz+qj34N1w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190712133258_1562938487824_0.4059803537931912"},"_hasShrinkwrap":false},"0.1.20-master.20190712151650":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190712151650","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d8bd8cd23d0faa87ae53ec1ffb1a1130f2ca384d","_id":"@atomist/org-visualizer@0.1.20-master.20190712151650","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7HFVQiN/VIfYLLEGJd0G6j/0bzQ8kYMsUt8CxYDJDW25EKhM8/tiPTRUtoO9WcoAvoMzbSLIPaMgtRq7tcdK+w==","shasum":"8ca30645354b7112111f5e2df9ee70103174224c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190712151650.tgz","fileCount":214,"unpackedSize":3072893,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKKU6CRA9TVsSAnZWagAA6lcQAI068P1cam4nCbyNyjRO\nRankTyIu9dWxE4yF6tqqyX/XcdXrLM3AmswfLnPX9la2/wI1Ekm0LX+fmPWY\nycmJACIWudNFAX6ZceiOnm2e/gNb5s3SBDkY8Hvu0cdn8PfcvHhPy6FNNdLB\nNPMaQQHFJCFCLwbvaejNd65BKnzLUmPz7+tFi1PRWBx8kGcbOSZdGFjxzeR5\nV/RXqDfFIVTgBGCctlT3Vp2G7c8xHCoY5RqXnxR4qXj1XXlYnxywApxlNDe3\nekOFJSlJKL3hJt/GYtDVXeKL4wzTw7BxkRTBbkOarr9ZlwKFflzfZo8R9idV\nmskvfoTFrBD0VUJt7Ur6Cn1qoz3vn6Lp8NOTAwonCGzJES6o4vYnlJ+Bvcii\nJ8kUQsOSvt9Zw/wX2uB9FqJ5+uVhmwLUzK3Q01QBK6habtW47oC0DQrIpClX\nJ+5eFAMcxgUPSYB2Zvu0XSiXX9y8s96LCShnW5m1qGdhguEveFhdH+Ap4/1z\nJWIyTWx7/AUbyZmA29HkQSfgkwYsuCQTwUr2OehGqHt1rRUg3wOOz/FqVo7I\n6qs9nTc+GS7Vj7RvXE2tfAvTjq/TC0dxSuzvbG/jj02nkHhLfH2qLhN3Rz+/\npm8/MNkzbzds3qXlDOPV2LTaGvrPPRQX+e3ymAOTet9qTeSIi+py07KHzZ8O\nrPaE\r\n=aOJh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/fXDgs0N2TkwBDmgR9n17kzLN1ZS83Q60PAIPZZ3XrQIgY+o+4mxT2YGjuhym1nHaCBTUNnpK7ZBH582QJwHCD5k="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190712151650_1562944825294_0.5270559760040643"},"_hasShrinkwrap":false},"0.1.20-master.20190712165139":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190712165139","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"146fbe219186dee6a3a9a14b13e8ff2ca273ed44","_id":"@atomist/org-visualizer@0.1.20-master.20190712165139","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ZAw4UYxExnlWjnMohlXskzVSglan4AbTEH32mArURASpq1bYoUawnBzls1cYjSlEbiPjOOadoaQvn5I0hV82Uw==","shasum":"70297f8b84b4c778271a6b0ff1d7360a5b31e384","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190712165139.tgz","fileCount":214,"unpackedSize":3072275,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKLs/CRA9TVsSAnZWagAAIDMP/iG81/oPmnESDAc37b1W\nixOq/vfl9BCwKE0BU7pm/+y8u+AtbnyUDBAGjdSpRNvREOk1uC49f8WtGhNn\nH4gY/56KQR0p28+h6yEgx7vJ+zw+HIVxO4QsRW8KyhE9dgKCAOccPAGOhXDS\nwbNXY+VzaY9uLhY3+QwzAH084Z4o52xD5A0A/30lyJ6jjPuVOXQ8smVlNiXf\nTiavnxuvVVrAa+ut31bYA/6z5o7xvGsxBsyw/zOhvMZO/0CQYdBWoxczVutB\nEunLQKB/w0nIBbsFO7Yc7npY5wmX8cSOo9o9NXTc0R20lkY0SY3CthpBde2/\npRbwknLijOl9F/+HLlULvb3f2zECHlWoroxvo00tvlPJGdpk9q4CICdCxpLa\nPSHwbRBfE2amULHWD0oVsAkknK/GVnMcITUIFBVLtYZBRQ2/r90yO9WjBd4G\nASrlRSRUZpdDj1MklvGcBFiJ/cLlntF3LdYS1IB+Z/lHfaBmjFP1IHge08QL\n909s+FRzta0c3CBbRe8GrFS72PZqAj0SiEZL50ey6HpR9SUVyy5yooYgZqbO\nxAPmC3bKRrykhV+dgNuY/F0dDKdNzPT9zI7AtiKbmtcwUW/TsYYKpVruGsaY\npgJf4DRM1dh+e9yB/j0tOmQIdIRqqAT3Z7ZNvHA/XpgPA2Ry8kijfn4gjQJB\nqcnD\r\n=yA/A\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPSP3OrOuHoN+Ies4+lnqOj1EOcaczL4/2wn7jAUhmPAIhAOHQShUa5/acJuNrfpdjLso3JQKWtVLtjkXHjOYmWwPV"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190712165139_1562950462848_0.8293543494780409"},"_hasShrinkwrap":false},"0.1.20-master.20190713014634":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190713014634","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"67f4fa8c7284482716766e8b83b82c4adc0247e3","_id":"@atomist/org-visualizer@0.1.20-master.20190713014634","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-MDSEapT2e0Bf0fbf1gr3abACgwZd3NEw5ac6mCpkf1NjY6/pxKgfBCNg8BzYKZKCcHXIiD5ik1lDtgrwvuq0IQ==","shasum":"82128c96576649079b47b4c344b617ac92ee8b17","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190713014634.tgz","fileCount":217,"unpackedSize":3072790,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKThkCRA9TVsSAnZWagAAYHQP/1j3dauko+QbymEymjzc\nx7WbzkC9zQTWpB8lSE2jNpM4sfM+oB6uijgl2TgPYHjPl3N7ZTeqejp7Go9j\nojlwQSOMgAdtfrMmZgmUQpeuGk9NODNbsCYkLFP/6X95kkEMA8FU9eudDGdJ\nU3ZfXKSzUjzx2vwpYQ/53HuxxuK2IQK4NzEtEGlxv1RDwIblnYSXvC6r+mK7\n1HX4U7gL34R1VA85z9Dg9e/knfqZrqp5i5bw1iri/OEtUfNgiFRabVBvv4kA\nHa3gLj7GMAMfiT6J0EYM6I/h+/kOlSzIKor1GAIOj+vCiGTFT2YYkz6vY4CV\nd5O9etgGprZYJySdA/mhZFSMMJYCM+WtFs530oEdEyqq3/2fayxY2Q30zCa/\nER3aMoYccsDeQaVJ3IZlOHZI62lGKXHwsRmlk9wbUcZKGZt0tAFZBa6lX8RI\nCfNg906xAJqXwIOxIlv7MCDsVd+WYNfBbceusJF9c9zIkisCGIjV9pRGl3xf\nt5aV+4+9TOBf/gcGLDi5ZS2hodrSTuA/zruI/EwyJA+RgwQ99XxTNBMFgfwG\nycGfQwcX7lkjr3LYpDdu3umkAd/Lk64TSyanVXPS7bXnikPjKe+dnFCZKRRG\nks3yc0HeSIIPxWnVdWJwh5ymEX/u2fJB/pDB/Xiwm8h5dkS9aJRDPQVIa0SX\n393A\r\n=hp0T\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRYYx0TUkLInP7vF9zXZyTVWA/jpzOnUpIacFH2Jb8fwIhANsZ/8oHgtNxlQWBtPBQ3Z8Tr5408u5188kg5j7AhTbW"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190713014634_1562982499979_0.2285413253893247"},"_hasShrinkwrap":false},"0.1.20-master.20190713022448":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190713022448","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"26661af3dd55804093d7f535a962d1167f15d406","_id":"@atomist/org-visualizer@0.1.20-master.20190713022448","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-zNSKPlqB062dJaClKy4WUY4nNhEI5x4usJk47gjFCdkyCZ3NOU+FzUG1Or1CkoXd3KsBG8SGtg0eqV7e26Q14Q==","shasum":"b5efc4a5a421423d89b356c21e157ab6983c56f3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190713022448.tgz","fileCount":217,"unpackedSize":3073170,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKUGiCRA9TVsSAnZWagAA8bYQAITy4sDID5Gc39jXgMqz\nK2XpOb+tkJXNTLdzrdt/QE7e7E61OBDWh4qCzk7ZXbq8qeeth6WmrDX4X+83\n8vPBiphFvfMD91OySjz/M7nx0ML1ZM4nC9yVfDch+eJUz46cUWnKa9KaR/bn\n901lMStiMukMrO59OSJxtfQ4hyyl0bg/p9wrl185Nd6eLJrvilg4ekGB6bqW\n4Ir4aKkQ9dfdvLHDrj9oast0U4CswLDOKGOfPEMCLOiYWWeJ0UFyMABsq5Gl\n15xL28IH9wSLrO7SUBGgoxEzNy5fqnB2HYxAUM+FSOchxkvkKq4zXogYL9Z+\nKvuQg61u6t9Xm0iSsiQWk/RJqL5mD/QNkyFprwtUd5U/CmNxWrV1bs69v+Wq\nPGf27VgBEv9shv0+I5pQ/O/RT3kkc2GdmfxisccPtQQsoHvlhaKMm7ECIMc/\nvloLpIKlaDTCZ2wpMJRRBXwCbyI5mt5XYWWJapqP2UnpW4z4kj3dQt5M1uwG\nLVT8o3C8UmdCFh5fSKiJfabJfKwQbpPtN/S+aB4w8iWJhExyaknu/WEWPjRW\nLpjF4eMA4C6JrWxh8p6x5exz5Gb8OQKnzMDcrXOzqLCGh7GldyWG/ixKMSGo\nv7S0WYyMqUZapHFvThXPCx0K2fYt+53DBlHjTTdG67XvTajPe6yrPLO+BxYQ\nSjpr\r\n=UzPD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIATT2f3yUDrl6M1f+Fw9EhhkR7GrKWtfcKWGabGRf7y0AiEApaJC76LBmirXlUsnCGFx+ZSnh74UOlpeTcukxQ53FQ4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190713022448_1562984865835_0.16163344658307177"},"_hasShrinkwrap":false},"0.1.20-trees.20190714102208":{"name":"@atomist/org-visualizer","version":"0.1.20-trees.20190714102208","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"085107ab37623291fe432315314b26bc9b35dc26","_id":"@atomist/org-visualizer@0.1.20-trees.20190714102208","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-VmBOB95O5GUN8Qd+NqFvGiTaeQqwSbPjTkk+0CsaYX8QBWTis6OFGWA5RluaO4bC97d83O+RL8SbtVF7t4tgKw==","shasum":"b1a4de83188bd39961aef04ae4e25b8dc843d08f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-trees.20190714102208.tgz","fileCount":224,"unpackedSize":3081865,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKwMVCRA9TVsSAnZWagAAeVYP/iJAPvrtixvb2NwxfTbW\nb/HksnYaVgwJ6whbZRxs8JuRjLH2HAS/cdtg0PPTHLsm2XQ4HwQL440lG7et\n9WUejezyuv5ZCAyTKWoIh0EC29wyJ5fwUAGnZts/Uv+BjqhTq8Cz0wC7+BVP\nWa74mUdlajqrQ5BHKgw70NHlt6wI1mzxEMot5jUgfzCTSpUGQOTd9i0UzBQ2\nQzgFIZt6e0VNdpg55FiESKGiBV1kVZoOCKgaiOjTcu69MY34seDsU85D8jt+\nLF8ertWddg42LD9o6Oo4SSPySF65+SAeOIJ09p9qfRKOzv9p1T/72wFMlcca\nftN/TBhMdO82F/iBmCMP4gdyM+9m7Tr0XNBuha2JbrG9Q/+XFPoeRwNTgyHG\nirPC5/c9zwEvo0bHUq6aMR7ySd9fafWMjBwUUIA6s0PFnBqCG2WThE9lSZJ8\nLNHe3A0I22tHLvb7m0v2ctKSVhIIq2lOXKNUVL8Y/dsDHp/3ayPU1YUQDYFQ\npwVzLSrhZJ3QQj5kW7AcGHG6yRO9P6t3XNhRp6fIdZmrLlKNtJDcyeq0Xc9y\nDbNRH+O3eowjunbhbBl0yHSch9UMCVEuRq6oOrvGD6F1Ery0UG/0lkiNMRQE\nXNUjwNHfVX6R14mmvDMOt9BNlhZHwJ6PTFwh9bKL9aYCCqtb6rbB9YB6d7WS\nYu92\r\n=DVgK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB0bNu0OiCsMpUjnF16anzJ3OCRrau0y3kRyQGddSeDDAiBgwPMYVIQq031KLWaoH9LpUptd0bQNfy9uC7wFwDuELA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-trees.20190714102208_1563099924596_0.13234724942170617"},"_hasShrinkwrap":false},"0.1.20-master.20190714102516":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190714102516","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"329e0758812a88d860262695cb0de2245d385df5","_id":"@atomist/org-visualizer@0.1.20-master.20190714102516","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-i7hxeX6KxMjGEwx2IMVWCE2+cNAyAU6KOxMb5i6XTETyBvKRMKOoYtxeQD71kvXbsRZNzyiIwJS1M2gAlq0Dag==","shasum":"e5a88f600dd4c2c820882f92970cc9dc40bf8143","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190714102516.tgz","fileCount":224,"unpackedSize":3081867,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdKwODCRA9TVsSAnZWagAA2ssQAJlpcjmozqALKed2T61D\nnvWvySrasAqcH7vrGqpBbSagWYSmQdXLoVmwsoTsDU5oOSojCuAEn5VjNxNI\nzQ51y8h189J3s1T8/j7cU4H5UZKJ/zhzV3+5qUv8pVzSULS+Hm7Jv2UzXJH1\nzZdgHu2tYK4FdLJy/yHd4HNuMZ5mtou76MTXmdaNqcMvww0Zn7vv1JKu+jzu\nSuNzPQVWK5jkFNSoFNjlxH1HnNstZMncxu5ovemZieFds9r8e4xi7na9HHGQ\nGGB/dO7K9YRaM34duxoJKW8L6nESp5Hw13bjO7xxqR02ClKO3muzN/+J8j8v\niJ6JnOnsAk1NDLhAdv2xOzMEb6IEc59NrGUSrTVyRgQ2ldrCAb2EZC+ueR8K\nIN8IEGwFne55FfDaUBrkKVG/iWRHDxxGBiDPw9zppczP6fMMjA+fBuIDXRRa\n0H1t++bS6djg1NlN57HX3iu5rhmcZpzUbV1gO2Tq3rwF/zrkUc7414tTRATD\nKB5HDPyzLfZU3BzkTPdSkerwgf7O2ZBK3lqRavx3RUUxgRkoeDMU4MEJkRwM\n/xSGPLqqYWiOCWmqgg9+/nEW3U/2aNGdNwKklNWtHZJJHNcWh65eX+Lt5PEH\nRcmYHpNoa7S3LfBl6IazmT4Znw5ulhFlbZCWA0gMvWXWYMd8x5wZYl4HUexb\n0y2u\r\n=v0MK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDuhs4irON+m1g/xOSSne6LmHMg9K307P1UECY++xsmggIgEQmY1WeOkdj3axTAZNw/4J0Y+NXe5XG7UCFYCIBLY4I="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190714102516_1563100034675_0.38999987316841556"},"_hasShrinkwrap":false},"0.1.20-tree2.20190715030856":{"name":"@atomist/org-visualizer","version":"0.1.20-tree2.20190715030856","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"674917c0afbf8a3a85f8dd8e5651ce5c05084249","_id":"@atomist/org-visualizer@0.1.20-tree2.20190715030856","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-UAxFC4QcpJq0Y9F4h+yK/lDelGCWHBMsGvdqUQUlTnQjrBxaIHxUe0q24+BRqEbfslxeEEQE4YxjXDndk/x7ig==","shasum":"e28741f16bea429c5a80d94dd37963500f69f5a9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-tree2.20190715030856.tgz","fileCount":224,"unpackedSize":3080901,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdK+6yCRA9TVsSAnZWagAApsYP/iXjm1aU0a26icSRJc5m\n7xTdrHjak24C9ckx/I8wrFIN1bgGuMEKwGMIUriZ3LD5RuQGPhIbpIZDOR5O\nhUcAKIJkUBWK+cmQva0knKnw/P49cEBhuLGjOYDghUk9m/1vlu56FobEKjVa\nxefmWcINM/ZG/kx9WEmA+eVXBrPLQkyfcNe/jAd9DuZmL38uRwSNJxAxT6Rq\nk9cYhvQYIX63B5GARXHVmsQVckN55Pphn3I06PnxvboRNMxe9QS/C0bPNz3w\nFrv4edhfEhHPF7ioRKGJ+MRMoo7yvBtSceTqyMFRcjgVRhEq8mcfM2sUfESD\nuhjkI2jkGn1L8ua1JM+gvuj/xzBMOkzZqeZQPS0grYd8zCIxqcRX3+WHdExY\nWMtB/L4Qu2m+yy0Gv9DN3VElHegJ13/u9O0mgTwQwVrRpP9EZr+O/iPAhbri\nGnLbd/MVbl7k4KpgyYyd02nZpF6clqGzXcwOm4Yh2kCBZJ2lhO5tzPHBd2KP\num76sXlaVuw//mfJhD9dR6al5srINQt1l4eerC+7YMYvMxJKCS4rgAm3pvhc\nwA9xoINqVLsmdPOGv5Dup65wgU/tq0SfusXr/HYKfhx4SRTE1F5yI878TAy6\nB3GcMlCohKJq9yvkTaym6OJVIVut982Xgqw4pd+x5i4HxEpxhz8NW6DgVabG\ngWPx\r\n=n0BT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH81s5TvsOatUNZgZVAsWU5FGLlDLeqr7wYJXc0SI5AoAiAqBOAegvHHkhqrQLdtkdo6FfT7/DKjTKQ2GIf0MA0FGw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-tree2.20190715030856_1563160241662_0.6934957816115577"},"_hasShrinkwrap":false},"0.1.20-tree2.20190715032953":{"name":"@atomist/org-visualizer","version":"0.1.20-tree2.20190715032953","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8c8beb806ee94d9c4954298e09d57e235715bf4d","_id":"@atomist/org-visualizer@0.1.20-tree2.20190715032953","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-GF7rzAP2C6fXGVK0dI0L5WBJczgEhb4I+I4rAxt27gsnWKz2AlYWQ5micJPHb16CoMpH/Ed0RTHwA1McQAOD5w==","shasum":"357b6584a7ecf6ce0149d6769be175fd6200e8dc","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-tree2.20190715032953.tgz","fileCount":224,"unpackedSize":3081003,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdK/PdCRA9TVsSAnZWagAAiTkP/iOIx71YBvidPf9axhMb\nrC447z9Vs1ksxBzXlsKfnOd3BzT82StBoZ1x2PJ3rIsgJFn6F/AL36srcbnq\nsr6hX1yke9rGkugOn6RamH6Doivrt9BKLa8CcO+pYwXXofupCEnVIdj8FWMq\nxC9CVFi74LrMygcA5EVd2qxCJd3gNB+/H7+jOTGe2zHiCNlkKDClTT/dAz+w\nbhOripwBfBDaULihV5Q+R1yYdTUVpe33Ge8CY5QW3pHZxMQPLQr8oJQiV+/c\nIzbPEctx+HSgnopc73F2qEocIMNGQSYFpMuJRD8GZZQWpF5H2TdIFFEPXiZ0\n7SNJL/olsSVywisMQ896SLYeFMqfZ+28qU94Hmd+opX8789Y1IpfDKw7IipJ\n6WZPBJ23vfS9UjipDF2zKb1NYeNtAKzAztGrVXjXzu+x90OqZjB9+bYcE/Ru\niW1vg3yvn6uO93l9Tsal9gjoIQnqMqbpBWipNNs80MHaVeUfBF9ohnGBiJuF\nR/uSPf+Eq0y6tCnbvTUtv2pTh5oIx+lFpCdD2uSNi6rpzdLC8x2IJ7MRitY4\n4MIWGmowOZ94PJV8W6PQzHUtQxQettNBmzlU61h1FXljNHeDhz2mfwt+Zg2f\nxlMY+bUBiuyf0i0Nlz64LAsln7qPGUWKgi6fSj2kdIeSa4HiVrLz5coqcNTo\n+t9o\r\n=sQAU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDXMvkKrekwRiaJFF97N280xrSnL+b4oxm9irlLz8MhBAiEA+iAvSHlQf6I7jtBd9LMpBB57vWuqTXeCHSDP+wY6pTg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-tree2.20190715032953_1563161564502_0.6675518899514967"},"_hasShrinkwrap":false},"0.1.20-tree2.20190715042200":{"name":"@atomist/org-visualizer","version":"0.1.20-tree2.20190715042200","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7182eb4d598a29aeda6ded5f97ea82cb3cfc0860","_id":"@atomist/org-visualizer@0.1.20-tree2.20190715042200","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-phhu7JkI3uWdS0J/WocD9hHY4g2vu87WkLrm2yXvM9pL8OWYZ6Sfl+4NYf882MMxrPNyVRQ0A/weUbilsD43Yw==","shasum":"ae55566ac2ec4d96607d41e04487df97e2b16dd4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-tree2.20190715042200.tgz","fileCount":224,"unpackedSize":3081146,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdK//8CRA9TVsSAnZWagAAqLYP/0R2wc+L2JIO1Pt875tG\neKXqvrg2lw8HsccuEECdrPjj0qVSY/Wu/Bhgh35Pb9VvwhYycii82HmOA1U6\nMeF+TBDx84q8sQ2fvYCPPloga2UjKrGRArL/gb1LUBsNsfjJAn140x21NeRE\naow74HwutAicyfW0/RbQ9YGBvlQftVmLOZR+TTCH/WNxe6T37n5/ltIXtJrY\nRiU6HyWIP4NgxWw3s0MhUQ0jf7JJdQICr7hfIhFLSqQQSwCdLrwWpQ6e+GaD\nnv7QYOlQXvKapUZKoy1W/o73W1jz+Uo9V6xNxCFEMAnrEM7iEkhhd8gCg51M\n4hdWyYowS00X64SKJrowyqc4zBtmKXYPFmqx6yxpSHi8p09C38XilXaCKmwt\nXDDzXa8xCQ6cNTrj9nSjR2ZStpII5tgeOpcEC/bYkZRgrS5D9ckE5YMRe6I2\ncLsZuvmNhqCpOkNYLsfQsFEPFEmA2OEW4MS105OU5i1dXOkAK5q/SageVA0J\nYnukL1yJQh84kWoyDlGJLAVIMcYIrOVIACad8k35qrv3pZZfScKG3tXwyJhX\nilE1lAGAmH98lZPbCQptH/8tQFkiuk6DPKTiHjUy1Ivdecwf7vtbZYEgB20Y\nJ+GRHFIfH5OaidtZ3075Ji3OSfT/EFIlSx+sMYH3g1iAHMTNNt3gF4/Vk4Jb\n1cdq\r\n=4Oa8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDavX263KJQSTtDTqt+/29kekUokkEdRRGVeNVeV598kgIhAOk81yyfb8tMl/GivZr0jSG5IqxiC3YTS0WbXjnm7Md1"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-tree2.20190715042200_1563164667420_0.8713128359886526"},"_hasShrinkwrap":false},"0.1.20-tree2.20190715043542":{"name":"@atomist/org-visualizer","version":"0.1.20-tree2.20190715043542","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c0fa0708e12e7e436df7267b80bdcb11f5ad6efb","_id":"@atomist/org-visualizer@0.1.20-tree2.20190715043542","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-2xMTub0sJPNHH2ZUFM1fA3inERn/TbMZtY8VnmvXGK7gLmEW8hkXZjg7SrIMhtQ+hWPcxQJe8/GEp9l5bicTQg==","shasum":"07b11ef894978a9043f5da8e3590f8540a86f253","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-tree2.20190715043542.tgz","fileCount":224,"unpackedSize":3081060,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLAMECRA9TVsSAnZWagAANTAP/A6OERwftaA9VNVoWX8r\nnDwDHtmmRtZD57Exc6N5SacPq9fR3wNP2Li6V17QlKWQ9TlQKa1lu+Ur3+Mm\noy0P4FlevpW59AD6jEI4mBokkFikoV/xZxgQidAapg8Kq5CB/Ua3CDGJYXoZ\nVmSAEP4DdiAnfefU1ENTnA90UDMWaBBy8+CESTyGhms16FT0b+FJhjo8D1og\n8fzy5OKiOI0nZopyalDGB4oB9UVuRehdhZ9H37UU4Y3tUAHl7ISxlzT6xknw\nGLM/6Jyb8sHojd0E1gNrO198flq0bgcbEBp1wMYOdocfETL00pNDMu0U9AVb\nzARPujLqlBs01xHuHOGWgtclpHTdECGfuwMAF+di768pFzkzlnITKQMzhIZ7\nh33UZaUzbT22dF4gLkv8aQtzafWdq8y7VY+3h+sW4ptCYCcb7CRoA7x+WruL\n8pRGTl7OZuKI6xJNbFWqYlEIW1Fkzyo+4hw5wUTqEkHSp9ke0wqXBQJr+DeT\nfGiyYHI778KRzUTHOVBzV9fZtvA4oBo7HILe6pSUByJQHR+H0HkYCElyn+vb\nsosrTBSWpp5QG7sPI6z4GIh5nPeDjgIBWSx2HHtGl2EKbVQMMF8+gPkFHq0m\nqUO7Uichyu9XowIh2ouTs0pvJnyoyuZ6K0GhXt6uM4nU5NuUM+mw0d++iEPq\n+myF\r\n=cNb/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCulUbHPxLuY7OPSwzwSZJ2cBw5awDHhNohV5WPzI5liQIgaGr6asZ5Dhu6qcIoqTYH8f76WxUmJsZ/fEHkPxxulsQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-tree2.20190715043542_1563165443543_0.08942114987045713"},"_hasShrinkwrap":false},"0.1.20-master.20190715043809":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190715043809","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"51c146de7864c6a27c6e82a378253335af927ceb","_id":"@atomist/org-visualizer@0.1.20-master.20190715043809","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-scmzz8YCUpO+8hT7jneYeu52Gy4ELKNhhtVx3PUI0VSycHTd/fx00/W27IgqaA1kR25uydTYX6G3kO3xPUEzrA==","shasum":"d51bc86342a21cad5181558c907dbb0ad4994d61","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190715043809.tgz","fileCount":224,"unpackedSize":3081062,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLAOWCRA9TVsSAnZWagAA9bgP+wexQZWyMcLjDyrCOaBD\n3GduPMD7+11nMamtRjKfmt9WDAQP3G9JY/qrgbuX5A2W8Q8lhBFpx3ZFMrtP\nHI6xjGgEmiIyO4YRP3JYhNlOIrqK/C4EtKLlSMW/0rcCWIm+IbZ7CPAmuzV3\nDL9QLxi87sZ2yhcYhdSMg70vi8n8eVk0WtGMdMQitAYYoL3ohj7NWLWfw2Ew\nokWleOJ2wa9iPrrVXjI42MZVHlTL3+QY6xu7Fh4zqQ1Z1DwrvZbDRQkyHsHm\n8N/O1O5/T4NyJxsICDYVrxhmWkrb6FUs0DKikiLrireTzHyRMdC1WqftxmFz\n0/dNGqi1pRf/j0ZXnJwG+1FCWDXZciZc0L7BFRCS7FD9WNlxNafpA7S+TEIU\njfSwBoOrUPGbWhBKWEX4Wyx5z/8798pfclJq7TFl0OhXQ1KUY9/Vxnw47cJQ\nDGPr4NZPCnj0nf48uepRpelY6HCeQzCaVWBvcFLJK9kKshbNlmzeWhdmtPcB\nmWzgeBSde3n0Kpr1Q6sjmWA4DcruaMm8yaY5BLWfb2FPT4snu+am4PnQMWw8\nUT0+jUsiOlrh0BFGFgX7PM6h5r4piRMTSlBLZaJ97YFyzNBCdS46L3LXEJNX\nKemDNA87nRUjlURpn129i2zfONe2DeNGR2mU1fFZLRFKyYqAF2qomq2UDUzC\ndf/I\r\n=V3j1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCL7mP3U6FWKwZ01e8JKciIbYN+f4vIXHcX+JBBG8k5swIhAJiDOT5JiDaG6KY1Ik9lNiTcH7sp92jf4mbUD7Rg8VU9"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190715043809_1563165589805_0.0014897455683362537"},"_hasShrinkwrap":false},"0.1.20-master.20190715044400":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190715044400","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4ab2d5fc7dc0d8b1670b1444edd38933d3b40f33","_id":"@atomist/org-visualizer@0.1.20-master.20190715044400","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-LERQBjGjjTxHg0YquO2jIsBathJxFeQaSNwIPt3AptqG6bZYS71WlOeEK/qDmqLsOc6wUnmAACOYzhx+AItW9A==","shasum":"3de5adef012d7a985c73983bb44fe46b3f5dc845","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190715044400.tgz","fileCount":224,"unpackedSize":3081178,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLAUDCRA9TVsSAnZWagAA1lAQAJDKzt4QfTTqQu5I9EJb\nEBDf9ApdYj4flpj6Vu27nzhCTXYkqLrJENq7yAhNnDy+YD2TaH7Zq5qFG5BV\ntFrVMONrnrwpIhc4S8Jyyp5MgZs+nPoVeSwn46KaxQF7xQZGRD/tWcvd11J8\n90OEOknLVtDTHO3LKRfo80DhEr5qZozpe8ksYJ+vRuHQ4oM57S+9tHnBGLYY\n1DbMZfo2YYGLQ2QkUXOscm7O4Gp3i60WasFNSuN6J58fxTE/zJmnBMPjzv/2\n7ktcUwKUPXaKZmsk88w4w65DLndaFgRNVwmiaPcBZNrx16GxOjcU+0AT8oWv\nTOhvXHdGAC17y6P9c6UwxblnQ2DI+GJcFD3ToWRNFK7QiQ98c61UjMy+16Np\n12VtuRngtJ0aXcQ61lXQxWs/IcTYKDOPFUbUcnjvVGpUPhiBE4Y6Cch/7Vka\nwUsCH6yVuCaIhSR23y9MgpIqLnZ0NF+q4t3ejuKA8uPHQEv2onwCqGQdp+Vh\npyogWoNbB9qdG8q/7tAUoKYN/EfLqNK2TGBDd/IAJQKxeUP53AdLCCcgl73F\nhLfolEYYfuT0wHef70nc+t2K32m72dFJIPHL1GzkbNYoUIUELskyQ0q84Tca\n7vnv5PvJVeZNInAUo1Ddn8O9eUNonbpM6yL3FsEtig32DWtoAB3FIbA+y2sb\nsPB3\r\n=k8PN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCNa4CsxVWiml7zFv4kaQ+0F2BARPTlkM8Mrg02qZBS4QIgZbTZRa0rrMCeC9Q2ZrjHDDVN0usd/aMtWS/WDs9xWhs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190715044400_1563165954552_0.8082032726270758"},"_hasShrinkwrap":false},"0.1.20-master.20190715045938":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190715045938","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4deb4cea3252c861ae1adcc319ff566cb279c5d7","_id":"@atomist/org-visualizer@0.1.20-master.20190715045938","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-TSnQC4H7KXVHInO4/JCQKWFhhXct0tBfZ7VVgCefwYUfiOTT+zeI+4OacJScteMvOjGcdQSaY5saYZJ+4W5FNg==","shasum":"222b5561209fe8bfed98c58e0e2a42c344023a9b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190715045938.tgz","fileCount":224,"unpackedSize":3082020,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLAiiCRA9TVsSAnZWagAA284P/2xMa4HtB6IjbxCE1/Rc\nYHUXyoKCIn3aLak4nemrx1WBhsmtCkaTDHTYJtvevnalW7e9SuLEaXhYYD3B\nf2racceo48N9SFRQ1fJW9R4OFsNisBoZsQgy8vCGAuXs9fDSVUGv9mFE7GAF\nrPznOwoooAar6KZw+ZKKm09ZZOVH6uhmHmOuKx9zKGabgAQPmWlEY46ts/+U\nBMd0gHr3kmIdd3OyLG/ih6rdQqS/pLXsfeLhIMo4sBleJPDYvM4Ykq/j1Fbb\nFUKN+0s7+iF+be1zVKzW9DJQEplEkVwKT419izA+9dlmHZnkCABj8k655KP3\nfmBl99Jxmo5mWw6XYvy0TiM0zKNmKixYekakXCrkimAnTQiW+sY6+PhWvpA/\nbg5zj76UBU1OxNrnxDGELLp0KJIpjOoEIY5JyeThCcLHKmveZKSdeWu+5wY1\noF1VlDtfD8JsSE4kAAujp6vYox2jbXpb0YALS4Bc7wrzMPJh4o0q8X274qMm\n4FZHDHVhZ6DhnlLZbCvHsD6OTbiNiEC0KNR1H3BozmFETAwh2cOe1mp0h6pX\ndj4xFeEYJhcLpGE2Xl7INjPy0dCanadtPSYhCOs7yTD5g86sBy1EBBsWJqya\nUy6tUMKznkiHct1vho7rLYLhF0Um+SuFZjs1KUxkPQExNXiOj3fUVX/RzDEq\nv+re\r\n=/vKr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC8cVF/8GaiHR62Q6pfZ2cDD6IPYWTX6eVjo4Bzf1jTtwIhAOJ/a+um4HNtJKXxHYxdZ80KPDErhJtB1EYO0ijsYsks"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190715045938_1563166882137_0.9912239133454588"},"_hasShrinkwrap":false},"0.1.20-master.20190715202442":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190715202442","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"432dbcfd17a178e15f037f5ce9b7699a8fc7cb0a","_id":"@atomist/org-visualizer@0.1.20-master.20190715202442","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-FeSnKbjXz6KNh2kt4HJn3B184h+9H3mVVKSd0B5N181yN0fpRx2lrlfKf7EBaRQjN6/6HTLKLsTeoCNuxLA4HA==","shasum":"9800ce0b5c08032fbc7fab0956cf86cc16f6fd94","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190715202442.tgz","fileCount":226,"unpackedSize":3112000,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLOGWCRA9TVsSAnZWagAA8kwP/jQq97U2mNTcTt8LWWZs\nWCH+SF1azVGPQkyGUML4VYdyyRIKgT1Ib7iUZZ4Pmd8PH+SNsD2oLOSc7cX/\nmLuGXZKz4camMN54R6Ud2Oqf/jvE4NacI/+cNQXVJeM/5tw4PuCpvKPOkkJ7\nv3XMCuwBL7eTsDitl2mu59wPx2kudVdFOwIkVR9Qln1M+Yf08DREzRcVkP8t\nxMT5pDJ0ByIr2Hxx8gmjQP9ZOIzXYbEtDnyw/yxc61GQr22AVPlPH3+iiP2O\nL7TmfJNix5MWttO1yoHDnH/1yMlNn4ptTM7xiTXc143UaOeOmYMkEhVZBC/w\nCuGAUFgLGY2CwxGykWTb924t1+Z2cnzsuLuy7eWW72Qc+mwHhgQw9kE0g6eH\nsQE+gQEhjfmier10F05jcEs5jQPhHU9EfO6utTtL9lt5ycC2W6rnbei/dSlR\nQuCJOyRWb9VLezRg70WrLfk0TSkoPMsLknXIkZ+50ULderrbzzLECcandW4t\n7q72gxaeuCQB1HkrHx/n+zeUFvDO64b/3krLzixVbffxhjtcX6oXF/XoetYx\nBO0lrKmi1EiFPLMx0pb6bN+Il3t3lgBPoQ2MOR8vbUdwyV2rr8m4kZ/rRgD6\nLqhubcWXhcri6wqBcZebDtGZGnCOmVzzz+ev4Xc6HldMyRLaQ2Li2UXytVNZ\nbDHq\r\n=tkEn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAXKnNcN2L4ZMNc1QEMD3xzkVUsN+4jp0AbwepsfSV6WAiBa8ONXQX2T3DewGOBmaivMNmcmDGPrXZxacmErvlctuA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190715202442_1563222421150_0.8817320107621578"},"_hasShrinkwrap":false},"0.1.20-master.20190715224047":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190715224047","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d06f6893f6a0c85273fbb1b31eaa2fd1bef48276","_id":"@atomist/org-visualizer@0.1.20-master.20190715224047","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-u218rXanOekDqt4bTkDHQTH8GR8hAHR7NF51jEsmKWKEYTWZrrnUWDODnmfsGLeCCYiq9YnnoJmYUC0QJCe9kA==","shasum":"4bd0447132f43c3346adce4d7bdfb320f47f87a4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190715224047.tgz","fileCount":226,"unpackedSize":3112409,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLQGQCRA9TVsSAnZWagAAliYP+wfg34UvBVeD/KhGvc4S\nZ4lGmlU2YPtgXxOyKp9bVDozWcu/1f3PgA2JtBOo/q9FKLQKtg+CAIPyZxwk\nSNjJad7SWmwX8E6dTj50MthxV+WNNTpoyLl763QsoQ5eGS21Ofl5QjBXvMgv\nNlE0mw9fHIF4eaLq/BXDXFHcSMsECULKCWKrr7GO0elVF4E04kKTexxhb4R0\nvF6yfJPB4dz1UDDbUO0VB/JAMqwBHWbaWRF5QjMX1fidkhXX6uDFsq00ogg3\n94Yx1mpEh2awKJQMztfPYZYjpRBuJPyYxZJWpJeknzPDZ/sIRlrDI3IMLgqn\nYSF65EsA4lgeSfJLNmA4KknwH2s3J06Q0+PZld3H3S8EHHTNuyYCFJOuuXwx\nThs7al034XqIvD1+fVUMgm34mLi4pLL/RpBJrY7ee4JD4937xv5dNnfr66Yo\nYmmAPYzfly4EF3nmmi+ief2Xlpn23xJ2a8NsqIIkGBVupRASd6Z8BjwzIzpf\nHHT8Jd2habpaqPV/RoU7CeSmTQaIW4sKd5GSWn1vq0yJ0QVF68x9PlWuZk/3\nSTPYenE5fq5Ri1zpdkrjbjZHa4z00yeqytyN9rm+aeDzCaG0pifAtveNCD+o\nJD0NiFE7iCnKvn8NJlpny4GLmh4kOOGNjgx0Tcaz4MT+f7EGmMddlr4KhgmB\nt1cY\r\n=4Tn4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPXrBlWV6EDc0YYy+eAh2YNG88zDE5bEPN1HRuN+UxyQIhANYr9wXFcUuM7gjfY85cBmwgVpaa00kAEvVtOLVYMWiN"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190715224047_1563230607867_0.216423176131729"},"_hasShrinkwrap":false},"0.1.20-master.20190715225500":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190715225500","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"bcbd247e9d7fca74005928ba21bf9b93bcffa825","_id":"@atomist/org-visualizer@0.1.20-master.20190715225500","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-2xu2B/htH9G9jNfP2yh3bQ5EtzDedMNPnjooi9fCEgXnDSXkTyzQJDuhhW/aVTCQDUYHsIhN2Nc2puZrrIVj7w==","shasum":"e6ca132441ee511ff87c3543c86ec7db4b749066","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190715225500.tgz","fileCount":226,"unpackedSize":3109993,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLQT1CRA9TVsSAnZWagAAS54QAJ57eHtGPotCZOwZItIQ\nJb3YedeUTjuPDLDHzqZaZgYHKdYxiX7F5CQ7wLbSR/BHirvIesgsCINO3Hal\n0ZR1uc/VXK2ZVXXKmjpOz8NJk39Dp6cFRcyfewuD4PRdkrLiPRdJUrdQfYO8\nblrcnnORgTpEZFLb5m0b8yI+DZtShc4a95BL+2Df9BCOS+PeW0KNm974uL6I\nhkRPNEk0Xjmy5J3C8WgSZm18Ljfi3FFORfEPwzUIJ7Q6gLTMxGD4HT4AlhSl\nSoin3+SE0GNR5aqqbwUWPrd7u9HbSQRg+5Fn2z/EjC8FHxakL2nqsVatUVe6\njhcvHqv3P9LIkmAveKd4IPrdB524n8zmG0+DWWYkY6960XBDnEWzLckuwE0B\nvwGL597LNw6Hy640tQgDz5Ey0fvA3lK6Dkk424Fhh4a4mm3mSDsNrVAMhSWM\njBLTmKolwFNs+ROUdbKcwQHTxO9NyHSX9CkYRDM18kMsyBBLpG/5Y6S8upRw\nPyk88/rpN6HH4jZ+Zk3uo4PB4kYEBYo4+RfffqdVXO7LOK93+l58zyC6AJlZ\nTzzkHR13NshUDXsXr9oY4Ndy52NA5o6KGOSxt3omVnEicb8HyQWb45eSvjQA\n13fEVQu//J3i2e0/iNb/rFdW+1vtotPm3LV966XfF7Abs8YSlOfBx0mF9KUs\nP4uO\r\n=FnO0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDQAj9iapQ0/NxZ5bvPTCJT0fiPgCrl8g06x193xxN0VAiBhAok2EQlDOJ9Bsveb0YENQYg1G8BTN6XG3cG0snAG/Q=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190715225500_1563231476330_0.1961191761266452"},"_hasShrinkwrap":false},"0.1.20-master.20190715225713":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190715225713","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6516d562a4d13833a9e282e9cb52d9361d82f99d","_id":"@atomist/org-visualizer@0.1.20-master.20190715225713","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-kGwvPBZ1incnLqNb+Baj2irYpGwdmxw3V9mrMUyEte+QtuX0TRy9MR3cdVzUpIm5Zds0pbs6Q+dGmA0/xsn9xg==","shasum":"5acfacf0b885839e091b16e8cf5f06535a158919","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190715225713.tgz","fileCount":226,"unpackedSize":3109959,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLQVyCRA9TVsSAnZWagAAd08P+gLnqqoc/sYitmNJXQ2G\n/nh69AqL6PVDWUApYMXtLE3nkpU6SB2YCMSN6nIOhx5PfBOpRdkbaqethh2J\nVFEi1S5W+IqDDrAYJAdQ6bTCJ4tc+PsOAkKL7J5NHpPRydpeblbYPQnAOqLk\nqm+rwylqo07KCTDByW23UHSV7b7zDh0VR+UvuZVHgAeI09cn1FoKmo7zC3Bb\nqOUF2o35K9AFsqNRVVhBYDCoaBUQtZJ4GQRy9IOkWNsOSgJ23kcu39lG0hyt\nn3nY6dS737F80sujJFJpQ/54N+bSQ/UywR/KZtdB1t2MI3jU8fiYKIc8IueZ\nmONCDGKWYxnYD7Z6fwarEqO4PgX9gy728Xja0vVe/zPWQEU6dJi6w1wJwS8C\nNQdix9BluMTd52g5q0FZ3jk/6wCA+8c5Ns3E37SK5F57BnJM/GIwL5zpy4ph\nMRyklKaSwyQc9ItXdpIpe5Nq38BP1SQ8p/cu+UqpwEU4PaNXtHSSEjTWwGB5\njHvE/6Ne5NIY5j+zxRbbkzfI7VGXuuTAOI6E2QISc9Wls4zmQiPYLQU4Zj3K\n4HHaUD/XJsbRJyVYKliTeju9P1RJVnt0gJfBVk9vELAEauLHi6H9AKFtTB8f\n/2nLZTaF4CsQ/4vgEt/KDnzDzhUwf2X9Z89LABS+A/rskgOE1hZa/wwcxMVs\nx8Mn\r\n=g+Zq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDd2YwxUVeGEcweKER6H7uNQ8HMI9VQkpy6qSZR7FFFuwIgM+zGFTL6NqrxPDtx7dDrlsTXnuKY8DqRQ3xVCm2hxfE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190715225713_1563231601456_0.16315015530898092"},"_hasShrinkwrap":false},"0.1.20-master.20190716004125":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190716004125","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d1444bbf2c35969d32eb1f687e818c4927b565fb","_id":"@atomist/org-visualizer@0.1.20-master.20190716004125","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-/1YEXZas+cyDno88YmGU/WecFR5ywBb5fn4K7vb+X1p6RR0LyKY5J/p7z2mGDrpn7x4Y86QMDAbGVJnLdj/gvw==","shasum":"dcbea8e5dec785bc7b9afd5a841dcc7388004afc","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190716004125.tgz","fileCount":226,"unpackedSize":3110750,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLR43CRA9TVsSAnZWagAADjAP/1lYwmPbp4wM9cZ05SwJ\ncKsKpoWbtSkwjCkvWzCZ9ZLoq66LSEurA/LimHhvJ6++CCHPNJpEWPhERTbh\n2vfyVN5xBpp7oKF0Deplb37/sb+InC9koSHH8FTIC3To6uHWU5xMzGakgm3v\n5MY79uT4/VsBRoCttbDFv6l87Lx+EA4MNrghXTOphvpwhKcqM5dq4Y8TOVLW\niNvEBrel30gfRnYdjOlGFesh+iV2d4C+lzMPiZ8lEDLO3nZpY+pMNWkU5g06\nr+djjSk1MSnG0ySUSE7kyrFQLicqVFe1UeHKU3xzUb55Wdk/wCpZh321fugH\nPVlxdrl/JX3nCe8EZQim8AMne1aln5gL6h4MvtYqLWV6G/YhrHQAyTykjKcz\nLCOsnb/MGopOF3nVAtyuDcOx2VO7+XxptQYHgFFFKHtSVvL3pMOUFc13TCN3\nebisLhJpN/KzZ27JiLv0pESwFunmRDW1kZHiKXP772XekHOLfZFbjh+puTdI\nh/Ogv4PrREjf8tzuPA9XQcrvXx9ILvyNE81JAxQ05TircqJVzeaoypXuYjAZ\n7/c132Wm1uxcNmTgY6L4Y8ngOm/0r9zIYoLQ7qBd5/nPgj6I+SQaKcCbqCvG\n4936cq58TyvKbsei5VJB1/bfpeZOceeYw6tXf4yCOpdtWTE7RUcBP44oEolX\nfhM+\r\n=Guyw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDhWLtbzwBtPGjkUAmhG/IdmoRTF5s0LInqp+oW/6GY4gIhAJZKQu58Jq12kB3/YUVPxDeW2pRtSVVOfQLsmTeptJUE"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190716004125_1563237942422_0.7712359148692227"},"_hasShrinkwrap":false},"0.1.20-master.20190716012509":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190716012509","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"28d39a56634e10a35b98482984e637a7c14768f8","_id":"@atomist/org-visualizer@0.1.20-master.20190716012509","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-kwuZumkq5KB64mVR7NOH6m46EkjPtFUjCGTnOp/PlDClgXazxT7/6tnQDM6RwCRgO1l/Ak9oHhkqNrnTt35vkw==","shasum":"cc38d8a9e80aa2d38ee633de2c8a5ba4eb2a682f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190716012509.tgz","fileCount":226,"unpackedSize":3111750,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLSgdCRA9TVsSAnZWagAAAYQQAJa09jyEljWCXUyqgnTk\n37NvmoDVvFRhcj0C3mlM1JNwxkRvWDjwyOvrnjFVA9RqHdDxRj1UMKpOsPPw\ntcrnIfI6skrazauYZmMVR4z/XAwuAyydn2NVoDDPnnc480yRg3rsd7vf20hb\ndLmkEa7xTxSZfNfjFEJ53LME/jv+O9WHwvYyWEjYXE/EH29E8SASHLwJAExo\nfrERyvgNTIlcCal6iVdmyBk2r9FpFtlXEJqL/JKwUAQx6qBl9MXC6vxTmFH8\nE40mCBYqOviKfcPYGB+0+7d1eWaySoVFf2zoNGJ2UACQT85vQsv416ueHz45\nYo3Yp18qffg8gjle8rVuPAV7SDLfDO+kkBfxv/XIHpbDnk4EPHjAbCZQihv6\nDJN08TdTr9qGreGx6aRmwe9y9+XcnHca7yZwNckoj1YsuFnYwCHn4Sp6VwKa\nhR13IDQYApHHccCyApvUy33n6jfj+7MtVMAheYVHQoPCc2N/Pc+n0gj0ZJX8\nwpEhA9VGEPjg2xxKMy0/m4bKG6Sb0lozk5qK00WPHdMoadrpInGYMrNT+dqe\nLo5SJ+VmGQdG1Nf9Vnxi3FGyh68o99RWuaHKvZfZR7tRAOmboGiIOCoiSRZd\n1Wsjf4LcyDJh+C+/na1B8mg+4GVxmjG6Pyb8hvHBzbvdIJdDlE7iaqH+128j\nBJyy\r\n=aCog\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGL1LvHAgDVTRGwv4xmJKcp1WJEJXwUmOcYdzIDLxOs3AiAvOZApp6J1ZECGbm8u5olqG4///3WLVNwzDEGztv49Tg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190716012509_1563240476667_0.8109159249452835"},"_hasShrinkwrap":false},"0.1.20-nortissej.metadata.20190716032548":{"name":"@atomist/org-visualizer","version":"0.1.20-nortissej.metadata.20190716032548","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"626075311619517b638b0263e42663f3dc5876c4","_id":"@atomist/org-visualizer@0.1.20-nortissej.metadata.20190716032548","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-QqO7lfW1HGeWRZMLRp0HgKpKSNTkQj3uvJJif2DccnbsvD1NZIZVMTXWfyTfyyS2b/FqPGqi6KouAqhMfBZcxQ==","shasum":"fdf6a74cf555b8cca54bfd09455c97de6c18f18a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-nortissej.metadata.20190716032548.tgz","fileCount":226,"unpackedSize":3115246,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLURtCRA9TVsSAnZWagAAjQkP/jrwNg/OzQgHF8hLhbgX\nvKPOxvY4ZoqZ1ntOAibWBriUZwV18gtK8AY4cFngX+josT8XmuhYICDBYxzc\nRBhUnbgzMs/M3I3T5lRzAod3b8ZXaCm1jBH0ZCPP7Y1uc6yAV9l6AinQqqU5\ntiv9FAVs6UBcsxpcHjEqr+T1Y/GBxUkoF6ykbE9udVQPhQx49h/MGvJ/04Je\nfgcROO3LiuZWfzyYICsPH6YlZN8vi6mPf/OE+zDF8xKzCCM4C42T8t5TpLgD\nOnXV6Gdap+ToKdoBpRxNNxXaMYl5exn6jZOI+ZjBUuU09G1iUUafS5/lJKLe\neHm8RucBaAmwEhYJR5rEC2U5JJ1enXqZUHl1u9Z/QUZIjmGeQtrjhSe6R9PI\nljBJt8ZFINXkT+RFDFwwtARjP8MXADWe2UDON5bq4yTDLY4lgBmJn+Xf0zMY\nRN6mjQIXbO5Q/ZXZ/QyGN3sD/RnQTfbaMKNUDHIKJzBc3lh6wfj4aqJU2HBu\nX10S9fkohB6AUsIcea4Pxt/0H0NyKLDEhom4BkSNJDK4noxb3lNkYtV91xzD\navlXS4J/rCeg/nrBMGMt/0Jh3DeeN/9mlPsHdFBtiIDh2PW70MZPvtNch1ZI\nySE7v98HChwn2LKgejrSCFiiAwushAuyBhBJAmh/+wxw10bNL5MoJ3bvNamN\nVWHP\r\n=X4y9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHrGsA6AiHO0o+b26gTrEPIgaZh4uIbt92GtN3f623bQIhALXo7ClIxKFgPezp0W7nVCCuuxr62XyHdGOyWvnUEtI1"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-nortissej.metadata.20190716032548_1563247724694_0.29258325543313646"},"_hasShrinkwrap":false},"0.1.20-master.20190716062531":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190716062531","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"41a398f393bda9fa50de067116cac7002e832bcf","_id":"@atomist/org-visualizer@0.1.20-master.20190716062531","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-vfYuze5Y9gyDkVEPEH9p+txglNNUrxY5IsfnXu5NxtGo7FiSz2OEzD1exp4i54M9QDeJVRiqCPCU1IFCFh0LRQ==","shasum":"37fbeeb5640987a8d776f2dcc04de8af38fe348a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190716062531.tgz","fileCount":226,"unpackedSize":3111571,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLW7WCRA9TVsSAnZWagAAKBEP+gMbbvJUXCHMdMFKDvRT\nRVKihQnnZYyDyT2yPMVbsNSDkejdvl95uMj4zCBXmMNgMsZ3huQNUOnoHzny\nwqv1RJz7ed9dxJM+BqFX/WXP7GmDE5qJIS4LlIB0wWQMc9y6hFiTx/JvkUTl\ncjV5ExGZZ7soSj69e67mT1/6+BCo7oNmv9/j2KDKG8hAe3UDUWMoChOsvJvx\np/67gtVOsAJdqplsxhFu2zBxmf1LjoDzh1uoSvrDaXTYg0zad1YG4xUgQ4sJ\n+M2VvwTJ0syv+6EcjmW/KxICKeDCGTYWdxQsixUdYjUkHyxZxevrnDsBQr5q\n8NWU3KWlkqHrtFVecP8lZLLs/MNbRoyVY3oks4bJox2uWKA2pvysO3vYlATB\n4VYb/Gzj+ywXg9lg7E/ZggGf8jGqnGjYIiyupzSVBqhdBtYPyQ02F/wVmZSa\n0n4hBTqrJQP/DqpToOcEv2GPv+tFzlPYOQsIydtdrPfOIHcQ3je3CZ4eptyS\n8z0Ltn5wChYSWThIx96sBGuTcV9zYTwWxCIo1Ydx5K0uTmP9N8hvCc3An7Db\n67ZWe9mvFhdWvott+XDgtvt7KFfx9ld0hAO3fKYxuhVw8Z/1TxPbBCeipPIL\nfoYINPpStjTrTQw7he7otDBGj/Ds9C4gwUS+xZA2ntghvzLBue/dGlnmjkGB\n0aCt\r\n=z+jm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmjqAwnJ3hZvZdtXq31jaLOqD1KBpPKwfI8R1XrryvQwIhAKMsGCL+eIAXkCkuNXKKTND5oLKLka4Nbo30ei0XlDMl"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190716062531_1563258581443_0.9098857957776827"},"_hasShrinkwrap":false},"0.1.20-master.20190716071904":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190716071904","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cf6498bcbd8f9f34297405bb9c27249da5ad0ad0","_id":"@atomist/org-visualizer@0.1.20-master.20190716071904","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7YEqKzKRnarV21g73jSpM3Ze6reBJ9V3elchMSJHk9l9CSlaGF769vMIu6wg9AJY88mSOQXhClH71LuelTNATw==","shasum":"065b03b453c7f59878f7d9bf963648b54a34c28e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190716071904.tgz","fileCount":226,"unpackedSize":3114474,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLXtsCRA9TVsSAnZWagAAZqsQAJKPN1q3+AslnuIsNK0+\ntqMCd16/XuIrpm59Z1T9q0RRn+imlZvqVnwGFhSUPFxQXFnkeSLUxuKZnuyy\nClkvjBwOS8dll04mQLYuudcx2MQls+SGQT7GoElbtc6gVdiNbI3C5uBQ8u6f\nqfqQ3ZNP9/fwGKaDSoW4ks/ypYenGCoSxkzf87GjeCd60gRcJp/SxT9rBS8e\n+K0FzvPzgEufIfrRIYaYmBikou7f9zrF1BeAwrUHK8RvieiBZW4ByPK5uYz0\no4htG3MtSsscHwnLjkx/CfqVMh+h3Q05dQs2dPn8xuQXCyniy9HttrA2Q6Xp\n+l7OdSxq35Zlo7xH50vblls0IuueuMeGoq4NjDuRq6STLPvaEtIYDgh6L+Hw\neMqM6nghjRH4ihpCwolJb6OZJJz/esxkOO+5h8qgc3bOFQS6zMG5a8Cjd6DU\nFdofdm1w/Fzw1GpgWvwEnmh3mW+XfrFrlj9RjGIldoXCaFX0oW0GTxkDODfK\nEFAxfTw+0XIGsh3/pxaRfbSF+JCeJapge8rItF+0c3qPHH0bUztJK5MjHSA6\nHAVugYDvuprGlYbzaHQwciAxSMeAuNnTbNKU5oEED29bDoWGR6hrFYlgoXjm\nHrkjI0hXXGZFVvxTpo5F9yqVHomiwG/QKdlL9Hjg8zQtjncVOy8pZMKcWinu\nwXNb\r\n=Lpba\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGzsgOkQJDzDTb8BWxPrGgNdFSJc3Edvqpn5nkWU9t8LAiAuseQ8O4JrGQqMmJ7vxpvUFJR6BKl1Dg0FnIF638PR3w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190716071904_1563261803725_0.23104045325910794"},"_hasShrinkwrap":false},"0.1.20-master.20190716072725":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190716072725","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b3f0f8aa91832ae455c380beb1b314b256f582dc","_id":"@atomist/org-visualizer@0.1.20-master.20190716072725","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-K+KB6C+cTKyH/P2vof16oXhHteXLegJTcXKnfbb80BHTN8YsmaBWLxrvh9E50MxiLux5IW0+bdIlw3/aVC8jSQ==","shasum":"94823e5b53aca6054a5fcafe0fa4ad845e27c249","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190716072725.tgz","fileCount":226,"unpackedSize":3114330,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLXz6CRA9TVsSAnZWagAACv8QAI/cmSuj3d5q0CfEn99x\nU1ZYkpN4K79d/pQ4oIeUazQNdAbmuQy6n19tT1fTVOZeN53l3/iUSuw8Qy5T\nq1G9posFCmGueKVooRRKyHon6Rhjh5hfE9dcS/vzsIWr5o7ObyT395CWUAOj\nVZ37qI+HBSLrFr6iPg9hl0sRFAiQuotJ5KWoS5w600F7qEcodIIgwzk1firB\nrZ1fx6spqJQtSZG+FlBgYUJU5VAkOe6YBwxA00tAcP4U2v/FwKPW0fsHcMT8\nnsy/7AISStOAD/XKEle6fsMwMuRwZUXDkt+gkNJWDzORpKSYzk+wjxCkPa+Z\nYuUTdVJ4X4FatA0FH0waOXvDuVywQDyeF8XL9sLzInGkKRymqCKEjD7gOeGj\nhHQHP/WDK1AqxQJCOEElX8/TuGX7pDJJhKi0pYNUdyDM0mZyOWMtaIkQv/26\nYiciwuuVlUAwtQ3E3/GFAxSh8ZqoAG6DfRBI6EtJPc+Eqpx6kzOFcchWYVjt\ntUiLRliGI5D2kub4vNgzgWqPKChMrq8W7FaeI0L4RR2/0Hj5Dj5+0xkyR28G\nhyuA+pHOwNKLuLuiXZGEUJQDFSXCt4foqXphnyOM+4pWekExTI16vygnrZ8F\nvXpFUNkFy1PVnk93F8WTe9L0c+VGKRfjtB7B1nIqASX2zF/Rx9IpjcbXluHS\nAHVt\r\n=N7vf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBLlh89uNudKK0WzvPeIWFnsF9qoERyFaYQMpXLZKHL9AiEAk2hWLtWI1kNNmYZKF7jG4Etdd2zAK8F9wL/myuhbMxY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190716072725_1563262201500_0.3119871864507122"},"_hasShrinkwrap":false},"0.1.20-master.20190716080223":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190716080223","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6dac1b7d500674ccdfaa85b6cdffa2227b79da4f","_id":"@atomist/org-visualizer@0.1.20-master.20190716080223","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-DbDYeqmKn8UklNwqxxZy8CSe7MgYXLAIbUB7LAD3bALyk5NE+ueMuHY/K743pKG2FzRTU3GAoZMuW9ktNECWeg==","shasum":"ebcee0d714db21aec9a6e705ec8476a5c9443823","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190716080223.tgz","fileCount":226,"unpackedSize":3114509,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLYW2CRA9TVsSAnZWagAA/IkQAJbmcb1UaqHwsc13C1Rk\nnIAfcmN/fegOGeYE0KTEzm3iSgpFgcc7VqEOlFlXahsOaxN4NU5eIX6s57GE\n9Sgr87K1pQKRe62N5UgDTnALf/rUi/NNYr/wKgV7AXNjJmqmON0y/xl5A/NJ\n44ZwGCNqkYdpgozBmh6I56M32Gi69x3KwWbBLmzOt7deI6DR/DQtUMSXF501\napd4w+wL2XdHLpbpo7y/AJVOD+yI02048QvlAKDBwuMg9K89UK4MJhfMBkv/\ndj9ECKIL2NP67p35ciYGj106jYOULuAvbEwq2cowiSTpDdtjMNNtTbt60EyV\n7rtJE0BnSYwbDPSPkJ0zfRRzBo+1OgtimKe8S+2lJwsWUNEpVjEHOoeJL8mL\nGoUBg2p3X9bwunaQiFUs8w9GiRRxlBASug/RDOw1jOzve6H0VOxq/XMvG4Hs\nUwhmEVso377iLXDyJdVWkjq6pzU40z2+h1q89ionfNCitqOLQqAc7NYZhqrA\nexBdnAAxI43mqUwyHpg0CgaFT73usYxTkY9/Krh626rCZEyiQS+h1woi54qK\nHZLk0H6QL+CFMPJ/ybRK0kVSv1APig7ydLQszNPniBEwf9DuGK9VruPt8RLD\nb5fp6GqRgAfSa6UZJjk2VJPoZzq89mQYVVPscVx3aDCKF3IZeCUGrBAnx/B+\nH1+I\r\n=uvRo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC87Ab0TRYmGUrV6Uv/bWxWfiD0CUE4HUZHiCLCmn1wOAiEAkC/k0DT7QtPu96dgmEbfawJdLETHSBl40I3kp/Tge+A="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190716080223_1563264437461_0.4497070126443714"},"_hasShrinkwrap":false},"0.1.20-master.20190716080831":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190716080831","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3f19eba60503513d1844a0cd6811a95f8a675418","_id":"@atomist/org-visualizer@0.1.20-master.20190716080831","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-sNYEMywumgR9pvwXKmmGjE0Rk+ldIAzqBkR7W4DNrm9ZcUYiKZvzgdvijRG9TV8m9DFd19XC5iolcwihY+YTIQ==","shasum":"22ff958cd0cab0bdd5f4a3b040d207b364da434b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190716080831.tgz","fileCount":226,"unpackedSize":3114517,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLYajCRA9TVsSAnZWagAAxlgP/10P+1YtW82O3FjgxD5X\nz4MqMbhKdxBDVqy1lSjTr5wHDM7h1zAQkmqyGqTgRq0MXvLuAAXqAunDyzuF\n1rYYpwNq6UYs8a7YTuUtFxGyRkQV6bYy+mMSCjObQ8Z60JaYtcNe+t3fD72u\nzcVR2xfXoFdIBdLfc2/QADJQTnDq2q/Qe3y1KN9dBtu1bOg1WfdaiKIgE9mA\ndTA09Is6sDvyTOV2Uv5CHP6R0nri8nIp2LvgkrKWst5zSWSzhOwd/h/p7Fdk\nxvrb5xLgXweR/B0vSwELZ9jySrZMG0I8BXRMtERlgKsaHjsmildZG9Dkd2qt\nsHaoCfxcKYkn2C3uMRSO4H1utZJ20yp6v/t+JEo/WqofcaKdw1dkU0YQlKsh\n3Q8qJ9cPbsvaIQJ5QArLqjh454Fn538I6CWLM7BzQ8mqYDd+O8m9//mbVacA\nVGnorxVmtOglLy7mBQzsTmIUcU39ijN4Y6e1H4PY8CtlF9JM+23xMBcRshxy\nY3TaBxe0fTbvTVho3lvKufPZr2xKassXenXFKx2V3IAt2R6GOA4vmf5XmcCQ\nYkXMfyznQWLeYPYYP8kdpX/BCum7I0J1kOOKgLlBl9UKCb2Iy5Qb9Zzq//5V\nqmgOKnmzFioI01ctrwSHV3qqf/ieDfpbsTcbUJEIdC3DoTFloXX3cIjlNzK/\nhA4H\r\n=/YCb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDMN5gOe6/j+WAOGp/i2yspp+cG25gqHEgP15vf3H7kXAiBzLJWzskn9GUduXa0EzMTXwmaJM62hHEFvpzrAAu3/YA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190716080831_1563264674732_0.3026810050668407"},"_hasShrinkwrap":false},"0.1.20-master.20190716082153":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190716082153","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"97f1bda085fb827c797145d8fe63d34abe3a5b55","_id":"@atomist/org-visualizer@0.1.20-master.20190716082153","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-A9pM/JNz2knqQU9sgfspWFf/vAHckwtxE9rX39jBuhZnEqn75qG9XBrUmEEbEkYNxjAwZgIR+2mUsUFCCN4t9A==","shasum":"9b89945f30595f76aacb9b63b7a256c3c4efc3ee","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190716082153.tgz","fileCount":226,"unpackedSize":3114626,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLYmrCRA9TVsSAnZWagAA9HkP/1X/9zSLCLHrWgmBiQ1m\nc91hgr3Q9dgNkW8a3A8nTlFvdldyRInVBRLANN3yJgJyqq0aEPr2oI35D0po\nVScpu3aXvPkjE5ZGoX9AnIzsfRjbLMxaXT+kYn5FhUVD7o/6lV8Kkfn/MRnh\nsPVM9lnJT1ShwK5L2oLfI8RUGR/LlZ4cssOaJbrosoB9waJxFfqgBz5ZOzpL\nVUzrAM5UObls3g3a94kGI0LaF/iAMj7Lo6kn6qb+5q7T7BED34rehQ/fPOrR\nFBTPv+2DT4LlQKj8WOLQPTlrskXoIFgtddYX9wQy7w5aCi7T1teVwsaXJAi8\n9PVj4h+C2QcfGD4BgnWqE+lo0s8rGwtg9Y/muRx6gpyFXVwr3U1jxSIWPFVe\nnqO0OaVdhbcmPIb6F7/UszrUZ6xLj0smjMvB2jTWn0t1uQEpCxKVovgH1AMA\n0DNkmbndsyxP95LgO7HtnaUVEHL54Njiyz8MR6w7BLONbKMFUQTsG6VzOiub\nJhTehNlOtSLiRz64DSdS/A2zu8fuByTk/9CL1ddbyLbL61N7ruUGoMdfiv9O\nKQEJOiOO0BSE/xQWYfr5A7acWM8a/Ivx+GV6dnvSMzknCYsMkGqy/FVSg8sE\nKGhTuDooohy94G1eCT1OKWOyVJpHJeFiMJ0cj99nNT9vrr91msUAtvlsQxbn\nDMK5\r\n=IE58\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH6F19xDlQB1CZPJtAw4L8L5N0HSKE7O/Fa3dmxyDH+IAiBSYSnAS8mcIwK9UsV2COdp7UkXxOqCL9v08xvDt94oyw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190716082153_1563265451205_0.6092757561327462"},"_hasShrinkwrap":false},"0.1.20-master.20190716092339":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190716092339","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7739789f853276fc0bcdceb2478cb89385a1f6fb","_id":"@atomist/org-visualizer@0.1.20-master.20190716092339","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-4KsUrEaw5ObhG4eWaGDP8G1YpeP8Wf4PjxyzNT7++J1vRjiY5C1Sq3cVafLNBjeOeQNO1zABpH+sNtI2uM2oHQ==","shasum":"5435cd06c1b1e98262ef40774714ce70114545d9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190716092339.tgz","fileCount":226,"unpackedSize":3115692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLZgcCRA9TVsSAnZWagAAn4QP/1g3Tv88kD1kKxy9m74k\nQnNZPZq+YhMkU8jfx1WBjUM86KUvpm66IeoxBcMVM2x0R2/KN6pDa0E9v6SF\nhOxOOOuQWeUxZqeW8jv6DAKIpZXzUMpWmXMc7xtazq6ogKk5LoRKpOhmQUgh\nuvwnGxSwZSCW2nvCMtaA8y8qSqeGiA5qjxVi/7JLvAwwjkpyzkxwVvHkvH2a\nUG9VVRsR8lreL0c4MZNHlnGHRVlBpMcOk/9idKkhmISGUmiNITSkqstgXOe4\nY800nUVsk7V5Y2AazDNLE5WTUgm40QptrlT85Jzr+GEWSbCSLU7PuV7MaRFW\niCiAX4AGGhgVctLB+x9ubnhelumR6AG3fP9Hrk3zQjLO7TJRmWofOplfNKn3\n5McNC6K+p3XI9yJS+KOAGmUQKIfGBcJQoVZhMebkf5dugqxpV+1/gTN9B0Ns\nioC3S0xzqFUePvZz7T/XVXKcXN/C9qBi+IzoL8DXeHZANAOh8kQoUxyYZmLY\nMR+yWhbokxz632WukVZ1cZqcyCGOu43rDw6bo+hWFUt+DHD9bRxUlsC7dPSC\nUZxmunp1VyUDyDfvXbtYTTKnJgMRHUVFgJz6nAr8ZcTb2MMf5IP3xpDFB+++\n63aPu+1vI8IONSxswiiRATnP2/P479FFTqe11tfFJprwUhAIiIkHgFOw9yJK\nPfih\r\n=VAwu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID1cvpZ6oCpD/Bjf749gRuAKXg7kVqtEDZH54bRBQ8DJAiEA0jerhUAtj3GCPv+PF/UU6dY1xFJRqQOIL/6qQTpir0A="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190716092339_1563269147390_0.27759666377489567"},"_hasShrinkwrap":false},"0.1.20-master.20190716102619":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190716102619","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"967494eeb3768f3ddf33395a27600eae70451459","_id":"@atomist/org-visualizer@0.1.20-master.20190716102619","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-cGMg7AJRH0m1aFJB11sWGR9yn/bPXIrKeiuLCMqTejmvxwUKUJdmDHKxRYWfhIB/X0RKJ7PtUkgyje4SgEOfgg==","shasum":"e4e7c21addbf92b07079b4255ba48a2fddc18515","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190716102619.tgz","fileCount":226,"unpackedSize":3117756,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLacfCRA9TVsSAnZWagAAnnkQAIBix1UKJ8pXtBDioSn4\nW+c3/V74gG9ETWl7Y+YYGSt6GjIQLW0MS/5FKTSSmD+339jcF1VnGN+odWGF\nnO71Hzzju2NhoHIdJxKFLBijwmjdwcdNrf3FRi5PL+QF/0bTlJNqFcM+N3sd\nmh1EDBfyD65cULdH655Ae8B5PK6Ms1Xgzl6rSxPX0g2Qa5ToVEAnzVWl9mzx\n4v+9yWsRR/9n1lNYeiXal/gFFA2mGmVZNqU7abuwxMhDhbNs7xCTz3BM1WXh\nDoSzsZgKEjwAIMlbbKcLHO8P1VHwLeUuXhc5op6ejod25Gj+3xr0ocYC2o2t\ntML4tvfdHY+wn8jz98bFTX6pZPdNFyyzx6ELiW0eIJ+OMkSn1/Lp8IDa41eA\nZX4+rs5K3q6vt3LY4NZ9rvGkzxlhFra9ietWAWZ3cKtFxtH9HdMlyRgpUtGG\n3QdJ9LugoAKKcYOws+jkIjZZCNR1lN+iJBPC91/5oU7pUF4V6nNfJ4qzHqLz\nYHWG1oS/RFIzb4P1CujJQxusnqJJD6vpdSlXstFSxMah9QWgX/hoPxzDER4z\ntCgRBM2isFBYXr7qyg3Qz7vmn7Zxqe/6uLTD0cVLgjUCyYL2mvjQRmfc7fZS\nhFpZWjByt6ucLWRwpHru0noyqeueOco2QRXJO0oPHNCNlDtGNg4yvJu384/i\nXXjz\r\n=KIZi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCqgy00xOK4oPB7ASuNUXBKkAcyLMR3RNfYZ1E2XqWg9AIhAM0yjMNpiuBGi2BwxCUbr7qPoSVCZDArmKZcnEbZb41D"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190716102619_1563272990542_0.40333060239366536"},"_hasShrinkwrap":false},"0.1.20-nortissej.metadata.20190716220139":{"name":"@atomist/org-visualizer","version":"0.1.20-nortissej.metadata.20190716220139","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nVisualize aspects of your organization. See [Rod Johnson's blog](https://blog.atomist.com/this-will-surprise-you/) for discussion of the motivation.\n\nThis app digs through your code and shows you how your projects differ in their language versions, library versions, docker open ports, etc.\n\nExtensible, with out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript\n- Spring Boot (with Maven)\n- Docker\n- Library versions (npm, maven, python)\n- Inclusion of a code of conduct\n\nAn example visualization, showing Docker images:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org, you can:\n\n1. Clone and build this project\n2. Run analysis on your repositories\n3. Run the org_visualizer and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a Postgres database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db \"org_viz\":\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box visualizations to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is predominantly done by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take fingerprints (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service is capable of keeping analyses up to date automatically, across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b0e79442557fd8608e99f349680f233e16cbc9b0","_id":"@atomist/org-visualizer@0.1.20-nortissej.metadata.20190716220139","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-jk4QBWBInKqsZH8P+EbCFcGVUG6e2U7F1UP2x35Y95/4vcifBRiS0TiI6qbCgyOuOPv2ZKjaWIHl/6q422msOA==","shasum":"8660e624b048368086545fef6dc249435f34c65e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-nortissej.metadata.20190716220139.tgz","fileCount":226,"unpackedSize":3115193,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLknpCRA9TVsSAnZWagAAK1IQAI4rMKlHqQBOd3k9u3JM\ntmFw/7eqX0Dgs2soV4e+3t8hODGnpmRPyOpzX87+YIaKYUHjcPjUBbwVwapf\nJiMsnFeWlZjM4s9PCWBMO2fXAv9A8zassVY7Gbie+GxdOyxngGIMJYNYPIA6\nVgvb+dW2tq53oCchzhXMggGktiCWbKcXVaWqbqpGR90aLbDIzhzNQnsGaUh+\nWZcgTd6ZTXAgxKtnbQk7hG1jJvPO77k3ruQ4MDFLaJuT+EwTZb+6otDOL1vn\nz0KnW31+4eUQsuGj0alrwNiRTo46/Inf68vg8fopwKuPR0pPbh+sWOr98iq6\n2xa//RNPn1TK1vDUPDwjwl1wAI6Npb6YCq4o7tSEGrWVX5t2e50ylABWHmBR\nXfyMbK03mBTnXFo7jwLp7fIqS18/n2w9iaeRRNVj+c0MkIBQcoUYT7gEVw0m\nB0OMRbnLZ9OPIzqo7SSIF+7W00+gN6ndMvD3LA9y+SS4JeIEyDAhvY2mRZyK\ntdVJ+Ubk7Ock7StII6Ihectj5txl4vWNLNvVchCXF8LbQ6EtzQsiAyzdfQyh\nnzb1mE8Z64OP2wdoPwIkN66PS+YgKcU8MJ26Gh+dfYugSjWPzxZhS6MpWSvp\n+HMTEgvecEWBEm3m7HCa0Qssxf55shTkYwuAHfzDGJvW5+LjmscMKhK/H4a5\ndnxn\r\n=56Eo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGGNvJrKSCrSrJ1TUc+xY44JUNj8yc/Upi8LdLHD8ePrAiEArztn2zckW1usZ/ii/15XQxiXbppshmV/riPrMz595l4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-nortissej.metadata.20190716220139_1563314664270_0.07734092933502423"},"_hasShrinkwrap":false},"0.1.20-master.20190717011604":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190717011604","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=8.1.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"99534c19e0d173aeec438cd39c81476a330e569e","_id":"@atomist/org-visualizer@0.1.20-master.20190717011604","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-MnOeYyLod/sijUZnj0jRN1+FiQHdM73ONPEzgSoDa770c3Ch/hJG6FWw+TeE8GX4becyrVlTixKPV4dODfLGlg==","shasum":"8b28c1dc4e95e83345645f93588053643423d36c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190717011604.tgz","fileCount":226,"unpackedSize":3122541,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLnebCRA9TVsSAnZWagAALLgQAJxstlry66XoIRU4plAV\n4fiOIxWFPIzhklbsZEPQnhu18zDdlXmsqTSxYpUCcmeAyzj3HiiNQdN97U+e\nVuMDhhzr0Jyug4+lTQrcKkJZvhiinYOnm6rVhrVy3UDU04WJNTFhEVntaR1P\nNUoY+V6Ob56nZlxuVkPnXSSiJ9/lCVYmacONu2AusJNa9jEVAHGaSYv0deg1\n5jAZcbo735leAgDE9N9vwqrPSJ4HDBrxds9kBMk5TzICmaIU758JpBKwVbO/\n+tn/53jAHVJntP6tLjfH7t64dGeKk41Ml+g88QLOx4ZekFMTn6S/rpO9Fnxt\nmoHmsdp0kWuM5uignoThXp19R/S/tEMUKb4EXEzNwPtkYmw9NTRQzlkUwyCR\nXLqWTmLA/fJe9AnT9tI7mcg8dfXDBxRHtTLrrjvMTv+5sck9OSwlN/PcbOUl\nhAG2Sd9ps1Azuryr6shsi4X5N1f8xVVLJC8utm64Ndz04UVKCUL3ave0D5kQ\n7Ru4lMIPgwCPzZqrJv1fEFSK/XQxV0B+Jrh6rtz3rKHC7jZf24dyQBkbPRUv\nH9bAttCQkeFSr8ZOQwuzHCTMt22Uy1ZlXR2MdRQzzUq/uWW9tRkx/iKuEZPu\nQOcjWSf0mjyE+nGXQh8/vij8LGo3bPlsC+msfHDrAqB/18vEK5rexgQvI8lB\nvL75\r\n=+j6Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHHron2V8W24fF2ccTJmb5BFpXVjqFDPk2IuoTA0mBGvAiEA8t6zZhxjLT42Aupqmvv4f31VJCDfLiB0RjPE2wfl9FU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190717011604_1563326362335_0.5213074350338645"},"_hasShrinkwrap":false},"0.1.20-master.20190717024806":{"name":"@atomist/org-visualizer","version":"0.1.20-master.20190717024806","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6512a0dda4e66bbb0df0045d921ea8e2648d12dd","_id":"@atomist/org-visualizer@0.1.20-master.20190717024806","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7YhMabp0p6guTr0VAWaVxji/OagTnqXslPWBiTgco3P1QQA34CZOQ1r67NpCaBLocRVppIj/qqeY03LAB0CmDw==","shasum":"af77e522a9e075deacaa5dc1a5cac48e5d936060","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20-master.20190717024806.tgz","fileCount":236,"unpackedSize":3138315,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLozpCRA9TVsSAnZWagAAr/0P/2xHSxY6X+uk3bhHQphi\nD2Eofpa87EatYSNoVDIG0ijy50dyoAqXeML52byIzzEK55XbNYzTf78f22N5\n3AvhrJSWkxuVBWvG9/9vb+9EKcbOuMIXkUaiRr9zprJlO08kf+UD3qTke7eW\n0wwvC0mnlPt06i+wU1Dx1XqX/Ylon6fWX+gMpq2DTlnhgBd0jAdJPmBqzC9j\nZqaj4Q0Uw/vx9MJbzkkeUHHRze4NxD11/CGPq+sSoWAlzhIEChHeXIN06ax+\nb4eazIwZwC4j9W874R0RIoRl6FwuWiqKtYB2dn+1i7j1+vaedvp2ObEB4QPI\nsJJ9T4Ne285N8pES98+BYk2xkRIUohPOmAe7XL5v+ljFpB3LmxIzfH1igRLy\nKkYfuWuqIwQBX6LimLWwqPgjbGzhyDkfslmD4WWIO/dvcrRrwhSLfnJidUdO\nA44buvNZCqF+dKLS/EUSV5CpAUdvfsa2kwLQ+7m+qYrtjyK6ZkEoue0AOawf\n54wNL1CSjk9QzmN1Wbs7JNxOGOi21MZAnaOqQ//9LrH10oHUmzaXSyLkxvFX\nWc8AFVhNZ3VE7UbzI4LhRq0iG69EGElm30IyGOLfDiYD+AzwlhPaMlFFL9Jh\niP7GpE6NNt7ugvOY9X1l1+JwVdCgDLzNhH/SffUQdw/DAfFvTlET6isSCCI8\nYJII\r\n=14tB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBx7bS4lV/AW8UBHFlG9De60ztk+K1gpatiJuX1NvntJAiBx5SHw/dijyFmye+anMh4swpMywN7y/vvrCneWDGevlg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20-master.20190717024806_1563331816299_0.5513928026541766"},"_hasShrinkwrap":false},"0.1.20":{"name":"@atomist/org-visualizer","version":"0.1.20","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.1","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.0","@atomist/sdm-core":"^1.6.0","@atomist/sdm-pack-analysis":"^1.1.2","@atomist/sdm-pack-analysis-node":"^2.0.0","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190428091941","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"^2.0.2","@atomist/sdm-pack-fingerprints":"3.2.3-master.20190712041903","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.13","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"gitHead":"7299c808c11d80ef823800c1ff1b0fc9e4b25787","_id":"@atomist/org-visualizer@0.1.20","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Vh/jJUiJR6aWsumnDtRKDtku1Sp2RlPS/+qXIZwY0nCn97WqciJgTZTya7TMWs+4skrWrnphRrF4G6ToiAqnSg==","shasum":"09d960ad3e1b48b98e48e5ec03297acde9d9004d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.20.tgz","fileCount":236,"unpackedSize":3138293,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLt4hCRA9TVsSAnZWagAATowP/1ftVOrAEqg+6DcMoW99\nmHYHCOkiJakvukp+7mo1qSNNITN+LakLlDKWAup6lJH2iXYmBA/HcYpVrB/q\n3a2/jBQ8XYWmYBvvxY+NcBo4GiwQKBONbJYiDK6VwrCTHRooKsa1MP13M25T\nYVSRYdhlWVrLNi9w29KHMmLsXzHi5N1NFdAfitlaSPUV286gWysuczNbqsnQ\ntI+KnWLk5HHOoUKm0KpG592sy/PZCg+jmVM0MGR9t6O/sDzae60Jm0zQAE/v\nUq8EJpiZLrz4fpAYIt4uXl3V6Ycr9NPTazIHWe3qKelDVgclnY02JO2fhRqg\nI4V4bapQHGRsVFwI6roqUZTpQkrp6rldXIG71ExRpqoruNBBgyc7iYfG4uZ2\n4bj/+3oQFnUF0bF5zg7Jyt9Ao16F6ia4zdENPIBCLL2sGYqNoSCzR6Xj9v4/\nRAiphY6W4jh8I8w8T2rlxGmR+UbiJE4CPnqFqABW9EuROWc9iuYlCSicZiTV\nfqr4DDJ3J4HIKoVdk8CP9VDdy597F3lfk3z4UhgwiwOL4AvqqHmQdYGceMMf\nXw3TW6p92E9DWV+R0R0nwheqtqgqGLslzyRlfwh3z/vbR2s/2fMODTnj1Ny1\n0b9ACVD5Tg7HBcUubJ6QSxrSaGqr6YxbPDNQmvPAGvRJeQMczWm7EuDU56iu\nOWlH\r\n=S2hJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQClkBnKfmzfnE+zxo8qaDtA4FNY1l9ZayKwEcotnxZlygIhAKaGnkJ/xwdfXV/VFAPePAy6b1IEOraFhMyNMPsCfVak"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.20_1563352607794_0.7753273255715065"},"_hasShrinkwrap":false},"0.1.21-master.20190717132024":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190717132024","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"^1.6.1","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e77112fb546d23009b492b5ff3e7098010711211","_id":"@atomist/org-visualizer@0.1.21-master.20190717132024","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Obid/b/NHbvriYTutUrDt8akLIh+zy3FW7qiNlZ3ZtBhonu/XDqmsxLEyIZxWyYlSi2k2uOiw0OnzYy2qdTnrQ==","shasum":"56542df1570a0299363579c41c8a6fad07154af2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190717132024.tgz","fileCount":236,"unpackedSize":3135600,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLyFdCRA9TVsSAnZWagAAY9wP/2WSYwf5l79qkb3SkzGY\ns5AbIc0NTlhY5yqZmRVHLQGD2FBk46Oxybs0jiqDmYB/yNEsz9bsRiFHe0qW\nlUimPky9lf6sb1F6GOdaHbirx25Nabc3Sha0Jbk/Y0UTWXL5nK0pLwZX/rmQ\nqAe3k7IJ0cKPVeqlwxD10SZqrmZxhwQLa4wDzPuAv6QVw8uvmKlGEK8hMXl6\njT2GQqCho5A8LOuhqYTGuH4g/xG7w2y7ujLujfptGc+tgGP0fGl74ExA751n\nhNouqnUtgUpKIdjLX79x/iXYE0LoeHYKb2sdQanUrMWk3esBm4uXVY8vLD5Y\nH/xuXzYjhZF/1flNFhUliUjEG0GZTq9ObA068LA5VNpIvGCGuldMigdZ/QmG\nW2tJ8Zb6YjzquCzgp5MrtMUyitU8/VPEnIOhBwL/VXiWipFpAfST3qsYoGVM\nPyM00RVpJi5YpLDYHdjhDD1jTDzTT8lPZmq/BWMMNlblIqQYzJOHqZriaX+a\nhKe6HcZ1boclk+YfJV3bapIwt2/+m9HMnjOajSJzekL+AeLNVFnH58ItC88L\nZE5IX1nY1FBVemLZpv1PbphH3Tgne8575aP2HLjYMaImGkM3czZOFBrnWhqh\nV2FKaGDoTZCnwdvv9aE+q6A0cWbC0s8u+lVcKkCT7M7uR0f8fCX823zXFtn3\nBRDO\r\n=snOp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCGDUKeDaxp0tAzPMjtw9GmZ6/MuGHj3+UHKTJxZh7juwIgBdjKNi0wEcn4WDgnGs1nneDByFAYaNSilfY/wFtOt3U="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190717132024_1563369821279_0.8668270782757914"},"_hasShrinkwrap":false},"0.1.21-master.20190717133706":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190717133706","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"^1.6.1","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e634bc49ed722f169c824bb4965887d23952bee2","_id":"@atomist/org-visualizer@0.1.21-master.20190717133706","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-GLPF63wU5m1fvIuCNyhslhfQoywhLkpctmc8gnQloARF/0wPa/HO//vmapQmFry0Or0Mbix1ZoNy8yObXkI4Hw==","shasum":"6a97ba5a1d85ccf2434b931b6e82b30cd1aee314","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190717133706.tgz","fileCount":236,"unpackedSize":3135500,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLyUpCRA9TVsSAnZWagAAlOEQAJbfYJHYTH9tv7EobsKI\nE6GP88X4rCPOqsyVPS3SnkWWqtE5tRH/fx8kEej7+V/diAvCShhV+8agYhVf\ncNphMVdGStLV3krvc0U9J5emiBMgOl5bn//xUCnsYlL+QkLAxHXsbcMMUwVi\nnANkNTKHFcQaebzmK36VdtDNEVwUwxEfWlM+jI6N29QO/WyKbg73p8DDopzj\nU/tR5wpyBU8M5tA01S5duWOZ+crSqow38TKOOyk3qc084ywlM+z9kURg4Dol\n+yuLGK6mR9RQAK39fWah0OTypuP0cKL+0E7fVw3xAdaL3nGWE/WLbwHNhm1p\n2EqeRdo0gfMk5A3L0FOoVnSmNE9wm5wza5KJ6kNlwehk5bMp+IwmKL98MdW4\nDGm3T7zVxc9527slY0rnnTwCE+g6ITufGdAwd6pxWPViu/HDf7kcYLRoMXRA\niaRcrz/dC1SqKZQMalubldnQKCMXWCFTa4or2wuWNemtbNFgBpE214BlV3Dc\n8mCzjEik0WdGFg79MhneB+36zB+8hcaQLWWudirhW0XFcces/hTLRXwjoghn\nHUAsDYZNBZugSFDQoGiCvybljF6H//x/BuyaO7pE3QUMhcuXN6a6NU5CCtOv\nzwJyzswEyBvHp/FnU4Gn9tctW2BIvauiwrF4xrgZZLk8inxj8Y6Vjl1TTWwj\npiOp\r\n=Prhc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQBeKeckSiunGwP/oYkr8nfi6+ZYCp1nX1XAIFqir2sQIhAPlCMlYoRydepi0gAy13nqXU5xkdD2PvZFy/LimQW8sX"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190717133706_1563370792493_0.6355633338341458"},"_hasShrinkwrap":false},"0.1.21-branches.20190718052005":{"name":"@atomist/org-visualizer","version":"0.1.21-branches.20190718052005","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"^1.6.1","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"db8651e8f6efbbe50678ac121a68ffbc3da250fd","_id":"@atomist/org-visualizer@0.1.21-branches.20190718052005","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-v0M9wzpWlENfSm3/gggE1B0QuH9AVhpyaHOYICtcKYmgfN7EVEO25lN8oLqjJwdJq2SqS5Tw8zq/OzRiIKKMUQ==","shasum":"7dcda2572c0b482fd8393205670b3a9ce0164337","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-branches.20190718052005.tgz","fileCount":239,"unpackedSize":3137145,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMALPCRA9TVsSAnZWagAAmnIQAIo4HqRXNrBSwolrHH2X\nUBA6fuUt6HxuZKecO0u1X04s3Mil3CBKXUbf2VPDqBQFKcXXwPw2LDy4Ppeq\nNqVi89hViR289YCc76R4LWzV+kuMMrQpdeefQDABu4BsvuoIHdWRsklxtJZk\niN8hYVw+zspicZSH5cIQfHZnCxEc+Wyhte1JCx4oXfYZnZH9MNeB/Sfu/vnj\nXIN3z1IZYC9K71i6xV1AVazy9cb0Gx87/tj1Be4xRaamJBP2l8KfgwQhSO0g\nKn5mYrehIuYx2myN9LKuuiwL/mErKfewUcbzT+2y7482ziBQ7Iz2Yg2BzBsn\nPzBAez6HoHsjs57/mxAehF75QGoqmCVd153WRjovYAnta8KxHtcSFVsDJfhx\n/mOmbvZ0hbuGTdUxAA3sU24YH202F9XBVe+c0pSe1Eh5RF4Bx2JZL/f9sKMD\nFXS3juGzGSYTHZu8TZkhZlg4NQF+gN3pK+d29vAGdAUMmSIUVb4auD3DHc5x\nPlhX1a3itbTArpx5fm4yTG5vEiiSDFfBcGrmz/T2kDhCrImtIy4qrrN7/n+i\nNGI0PSfiH18Q1BkYTzX0LO7QJ27gyir0bdryAL3DoXXAtSBwL/y4qxvO8o1P\nCJV+7HEbJTUfhPFQxj7vKSIXltIQ7+H3N7QPgUeQ09yk8lcyqq1UDhYszmcW\nPiCU\r\n=xP+2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDxu0yrWgd54gZBYOHWVl5na4PM7siLMjFIVt3hPkNNbAiEAiIkKqST7QuQ5Xg0MiGLzguZ9F5bAqhXOxQniY9KWarY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-branches.20190718052005_1563427534242_0.6260088738659797"},"_hasShrinkwrap":false},"0.1.21-branches.20190718053443":{"name":"@atomist/org-visualizer","version":"0.1.21-branches.20190718053443","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"^1.6.1","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f4e1db7d65ea3f4ceaa5afc34c7c04c3c62a7edc","_id":"@atomist/org-visualizer@0.1.21-branches.20190718053443","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-bcOenu80vyeEfMyJ88bAy/vVcWRWRkilNxT2O4te2ichKcQ4+ry914QtPl2+Bz6V4BtONVbpiI1sxLyl6bul4A==","shasum":"d9029ee73c9925ab80fa4b4bf4bc069ca456af1c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-branches.20190718053443.tgz","fileCount":239,"unpackedSize":3138380,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMAYoCRA9TVsSAnZWagAAl5UP/RO/L/T1BMqbpgljMUVM\nhjItVTqeJ8R+PgK9+6texJ4KELN6CI3KeIYKIXiJUmoYJnLdMUej/37C6Sh1\nELZaqIJPOhYcyfIfqmi1rbKeLRkK8zGj3XOM/zSLyhtOFp1L6AbwrFPw4YVi\niXJhw7RRDa2acw+40aNk6JqwQcvLQXMSo9G8p1M0EgRHgn9Ppx/Tqtzxe2WI\nNwOTVriG+XufF+7eDp4v9N4qgXaBgevKJjEanAUy9dyOaQHRJHei0iy+NZrD\n4JObqolxfjE/F2GvXxfAuUPmVS3m9lNR/luLuTO8iOYlqCNKBT1RCRaZ2zKP\nE/JO6acx+c3Ds3coavAs57QtFVXJEsdmmTs8O53VBq5F0kwRM0pg2l8/nnAL\nzj2NUqSOcAwCe/wGLdP28u5ZdMmuDhHswdrC4eNH9gJ8vbklKk4UpQS25zdX\n4FtI7q44nNLlVMq4dA4elBvp38tJWnPDVwBT/Q7+UAc28Y61Hlr8SXq8GIV5\nqPKEnHNUJgBrVO4QmbI1Aq1jlMuMrwKcshyJE36VtUY3gO8u/qzaZijcV28I\n7r6Yy4qucVRY+BsW5sYYM70ZG2XXkovMUSqZe8mFBUjOjdJX8X73KhnzE1Sj\nUL/AYXlBGfhifjqnvNnXNmC/2RIK/cfyCIs/kaMcX4wFnC+0wDqmbmY8u8d5\n6+LG\r\n=VjYT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDFxKsbrnhJhydqjJK/aiCmnngwuZYaL028YdSS08slPQIhAKfCIl9g8KHbbb/3utP+Sgm7KsRiYvX8fHVZtXdqy/fi"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-branches.20190718053443_1563428392164_0.667780393701473"},"_hasShrinkwrap":false},"0.1.21-master.20190718104920":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190718104920","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"013b649143936d3ad445c502198534b419fc30c6","_id":"@atomist/org-visualizer@0.1.21-master.20190718104920","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-5Rh/MNwfmRtK5qQRVD0KaLuAWZKA78qHQMmsmPhzQb39hsh9D6Hh7efob648qAe2B+bHpGlXBHPMpZ0AZoRL1Q==","shasum":"ca2d01032d5141c2ed9aca07973c6ae24b754a72","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190718104920.tgz","fileCount":236,"unpackedSize":3135707,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdME+6CRA9TVsSAnZWagAAQyEP/1UyzZgLsJUQXss5q6L1\nb2sMEEGAKxGh2+4mXEMTIn9rg1CFWOMNTZzIly0rPAVRRZc4Bf5eLpoLnzsB\n7xtWmn6S2PBxksl3XqAKcX0vUfWMSy/JzHhSW40PS+Pm9PEuVgMZjIDnMCQq\nkTObvohv2KRMJAEHDk6VasnbbpwhN1bx1g/J77AiliDDNkFO97EAAFWIKk5L\nvusVGpxTfoQ+/jgyLCi5cmAqYEC0GKfDRIMvMVK9yjdeNEuE6N1a+X17dRPI\nbTALXDKtFsJUc1gnPHuHvHJPx4u6sG2d36ceHRd5P0IIxH4JzDUmnZwOxa6m\n51e4ZyQ33TbExxC1Cnhz71us4cwadADD04c8UX26gDAfMiNaI2+5Ny84wMal\nGJmspNBPRLZRfsN/G+fBmVvpDtfFFoUkrh/HikJ7s/Kaax2pXBz3fu6x5Lkt\ndXv1W7CMayzsP1bkTflmP0psv2OpEVkdMa7BaQReywtB2qa7Ozr2riTxNKU4\njKQzfeaTqhzsIAftnrU+4xVq5/inbYu5T+V4Ky0BbbEjm8re1tIac2TDS1+L\n7FB9/maTa8hNjL/T6tVJopVUQh1e37xFXIW8iJVdk/33Y9vkxVrNRvTRK9+9\nfRwO7AEzCVUZkRejAbxOqZYI6SlOIZLjgrkx4mdT6WHnQlBSMRekeTWAgS9A\nEtXy\r\n=2h/f\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC7/wOYS8X2t4qENl24TEaS8SWMNAEA6zhoWNm4eq9FtwIhAIeSI4J1R22nOjJa4mTvss+KsxOrKOfoqnP+b4l+frb2"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190718104920_1563447225446_0.3181980556937283"},"_hasShrinkwrap":false},"0.1.21-master.20190718111730":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190718111730","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7067afa90f568ee1bb798fdf558c84085d3fff32","_id":"@atomist/org-visualizer@0.1.21-master.20190718111730","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-AL6+E5NRNyz4+F+GYVAkis9KM9moYd3Td+GaojWuXUrq87fHNVc12ZdT+mrwu7xRuUVQUbS1BYFUOqCum90MAA==","shasum":"9aaac0e995eef0fbff67af28e5bac18917ffc855","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190718111730.tgz","fileCount":237,"unpackedSize":3105371,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMFYdCRA9TVsSAnZWagAAyKYP/izN6Co/lg2VJDgphYPi\n59+NNJiT5YracayS8Bsg33se1r42zjL7WTZiF2/F8gkKTYd6HwBIb+5klTfp\nFIrk5MHpo2nJWo3gIzOMO2jP/PjgWLuupvhU2rpFkTVysMzrWSwNy6NJkllh\nq3HIpjiAQR93Uml084Es8W7KpmFcVF1eHSVB5BilB87qfrWYFh/8jTlXeOiV\nYBewHJSj++fFdPJ9F9JFACaPbpWpcDZVoww7OuygyLas2YtKSaQiyw+TRyu5\nLtaWbrlNxcAHXDJOWhIRvps+SLBY3kaSoKu/M/dVlO5yh25UTpdXCKTCLu6h\nIAxvHatavR/wPY+bBGZnQcMJyzGeDRQwVYZxvb78jCuzUEV+sILPXoNp3Hhn\nX+bY5yEbX9BT/oBQcnKtvWJh167zeBy9Wt6T93/Mbq9U2NluwSLpYoQx+Rue\n9O8TblbWQSPU59XK0GdfeiVrwBs0xBstvsgB1Gn+nNuJlroHYJlKtujkKxoG\nL5hSQQ2XJ8ckHav+qSBiWh9sMKRggA/4NCpezlWevIWrFDjv/SChRj1N4ZWf\nkgdtfXLsCrk1W/Q/fdhy8iJKlZD5s9fULO+Ey5fR6ZTL6bUJsAFvM3cSLy2+\nFH/iF1IWtB7BDMw6AsE01jC5gkLoNtKpd1W19XJN6tnt4rJl246NmDzZ+zcf\nnxWE\r\n=d7/6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHuLS8ThpEQ+voDGFHY0kifnEFwIbIccE4PGURxxa4kHAiBspuMmjmPstefZeOorVCiRodVQK99CGwliNMxDQBcQAw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190718111730_1563448860297_0.11475625803783829"},"_hasShrinkwrap":false},"0.1.21-branches.20190719004355":{"name":"@atomist/org-visualizer","version":"0.1.21-branches.20190719004355","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"^1.6.1","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6bf1e2244483b693aa654d9086b44d9ad1d3441e","_id":"@atomist/org-visualizer@0.1.21-branches.20190719004355","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-OLsNhqADB5nv5+JbmdUq4MZEknW+IehGP99Izwt8jrWekeJFynyl2HuGxF8us+bSt+sgnTgo7JLOOdC9Xe0PMQ==","shasum":"275f86dd84ebff55da7a69e01bdb5cda457182c1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-branches.20190719004355.tgz","fileCount":239,"unpackedSize":3139393,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMRMxCRA9TVsSAnZWagAAnaIP/A54a9OsZ2H3vi21Mxjx\nDVXxxzJsGp5C14rQA7BqiG7hiTBFnaScHX6+J6KrAgKh+BoPZfo7QjxG7rVo\nZUYaxyhnj+Ej8ZGnLmt7ABiyWhz4ixHRBV8hzGt9gUb4RHkrIFxXZhh1mdB4\nqhOLpgxgH9VV7EfDWY8k8bVPy/Dk9yywF0UO0ALNeDvIJjsmVq7w8jsbOxE2\nTCdaTfgXzZWFV2zqIzYT6Ui5h8PMJdV9OdDioof1MU26Ukjkm4lDugFGKhcL\nkoLd1/0MnX09C4VUmTItXYAIpsy2v7bMRdI6EXFe10IsEZFJeRSrj+IRH+cb\nNCZuOjVdmmaKgIwjrWKx/2nhvUqeUK5KoaqQV8k/o0UBhK4mXzBKsz7QbfGv\nbVtWYLbpg4Eu7CH7jk9rvD073QwEBi8MB+0zRNNprA+kucgWaf0entz1ZdY1\nvxwOzo0mnLwoBiefdQscS76QRY3fTgvXzhx6gVhrziwuSui83AWhLfYjk9Rf\nAZaTELbxKD6vSOP/s6BfwFJVJ8To1kIKJSUth+Lq3SCo6ugtjfT+u/gAMjpL\nn0JBVf/iFeNQpvfxIdtENyOz4Pu9urcJLVlI9ABH6ahF0xTbhs3PQCORPrxE\nW5AGq7LcuOVyLnSgfFbK5BP5mmHZIpUi8DXNmZzmSWwKfwRXAqD0d3EJdyNp\ngu0L\r\n=2q1a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDfXBQ2TlesbbdP/DffZu/qTU7VR0hYazZjP5PcBbOFNQIgVLQ2sdniFeDI+mJLfUkVp4bXU7w2Fwy1G1klMAYiH0I="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-branches.20190719004355_1563497264198_0.10837110385578708"},"_hasShrinkwrap":false},"0.1.21-master.20190719005115":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190719005115","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"429f636c7311366cdd0cb84e6f77282e8b6ef36b","_id":"@atomist/org-visualizer@0.1.21-master.20190719005115","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Wv16xIZ9MrsCGWevxjDgRoZ7fWM0V+PGLGoi2Ku++gPz664ZQClM2dbtDuPeqafboBW/FjfEvsH0W+VdKRzeOg==","shasum":"3bcb95c44e0265b26ba313a586cdfce642bfb61f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190719005115.tgz","fileCount":240,"unpackedSize":3109260,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMRTaCRA9TVsSAnZWagAA7woP/RBM4zUPKHzcCpvKluCi\n+SG3kGE83UNBK0YAAZWzny1yZNDUNxxXsdQIYMELNQU7vdh2FxWCAip7bBz/\n5BK9QjOCv+2u7ld6VunzZQXc8nnzKk/kYtX0ZaCfwGq/dRlhH5Be34LdFeUw\nh0gD73ZoXMox//SnKuj4fG6RNTyBL4j5ZkCChad9Ig7qCX76f++TOUERxS4C\nJDDMm9TNFepVryD5Noz7HE5WKIgsHZszBc2r2OGczMdpFghhQbfq3StYN0+Y\n7rmJ/eQlyy35aw5M/h7r0jeRpRmmCyXTpFk0QYU9rk+4+8Oire9r/rsoCo+c\n1nOIwh0lL17IrFZkyb4L8RkX0DYdfwPtZO5x3Fc2zNPU/Oi/wUsxQ+u3gtn7\nqq0EWjuYWPb+5nVTlJse9BIQltaBUrLXRRMugUOdQ0dIxClMK2WeZCl2Gwtz\n2A2YoPWMZA4aTVkb7DlZaS5W7nB9/ATjQnuoNN/JmkYa+iOddzPOrRSVkKpy\n1mEUMsdzQCFc7J2REkgUcKY/JXdZhP59nDXIj/tw55lcFA6MM+JBrvMXH26o\nZ5RohlBNLFKPiZouBB3eg03gPAhvUbC73LBYDun1Xs1fPcirz8xehJvQ3dyW\ns4CiRvXtHCifOouT+a5YXmR8UoHyxNSoHScJDlFMCQK8s7uAKbm0l95zmqig\nXlp8\r\n=w6D6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG95T0HKu3pRuXQhdrWFBjDPFziL6UbnL4PvSuo2sJHWAiBL8bjDZiWKtFMtvtctSw5mhbqBdbc7mM3YRzjt3JfVew=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190719005115_1563497689706_0.8509335748445266"},"_hasShrinkwrap":false},"0.1.21-master.20190719010150":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190719010150","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"487cf59cb50009bdcceeef77a93c12056551c73a","_id":"@atomist/org-visualizer@0.1.21-master.20190719010150","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-OeilB9Yy0mhTnBDR8rCDw86eAwhtlazG8Ly2JfPefFByi6uUOStb1EIBjg0OXPEnrvGL94BXjWN6nJs3WHxbrQ==","shasum":"b667204f7c6fb01391948798d0f88a9a1f1fde16","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190719010150.tgz","fileCount":240,"unpackedSize":3109114,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMRdrCRA9TVsSAnZWagAA4OwP/0YoL+toqrBv9WXBmtl2\nFUZpVWcMdDyxcpjuo+aCZMrcI1kUlg1P9aB1ouRtlLRZNHRHMmrKVSSeOQq9\nmfOMT5mUov770Dvn3AKgOo7KBFyc7UTOhtlBQ+01O4lHWNyr0f1zElqRHiJ2\n2M0Td/8biE9mekUeXOUqUylK6Sr+ZPQgFsCoU+CJZ+oG/WIcTQVeajlt7lEQ\njRWa2DPnGXJ3356UoN5+tmfkHbztsKKRW3xyawtLggiXCrpXsgiWEoh4ndLn\n2r1GrExJUCIksMO+t6JmiU9EmqK2Fcs+O8Fazc9Ij9ETkGzy4sBHF9csxqZS\n2IaNu8v8XfiN+AhlZrN5get+koGgDDPf/aQ4Vv/TNTZ/J2CcsCdB7rifrXoy\nkB+xufcFxeKwJlEFoXkuNUQg2ehjn3TVEvZEGCC5CYQBtKH+i90YS2k9eFFb\ncwYX3zu7j387ebkvsDrHrccEM+B2JyA/QITyhlpAr858olxeOnEKjL617M+z\nLMTlKatzqAHVyijZhAogE8Xpnln+s/VdHLrdB9m21pDZD6YwF3x9/JcmeZwP\n2l6mdnxakUddgpHb9bjqIzpza34eQV1r0bKzlJdRhBRCV2RhFW4G30qHy6Oe\n5SFlMACRJFH9rDi/fvz7lOKIITDr3jOwhHTeS7H9LK2p8NVBzK3SsbZp4Rjk\nAuE0\r\n=hsJj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQFMfYuB6zcpDj8YEtYmaDaaFqHvFllPBwTdI59VDUzwIgExrlu7hk70poqmHgj+xf/x/ZOCgkkdiUJtOPCDX3Qfc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190719010150_1563498347199_0.4436676945077258"},"_hasShrinkwrap":false},"0.1.21-master.20190719012332":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190719012332","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f8ff54db60df72c76ff6db04d7158ca20d859994","_id":"@atomist/org-visualizer@0.1.21-master.20190719012332","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-vMR3hOEqkPw4Q6RbRUD01SopBau37Ix56TFFkjwEVMA605h60vxCsESAPWPD+57uf+dmKigY2Cbwm55aPv5RzA==","shasum":"72af31ed2babfdfcde12f5d1b9d0880de4048ea2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190719012332.tgz","fileCount":240,"unpackedSize":3109109,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMRyACRA9TVsSAnZWagAAZaMQAIBZIHbj2luT15NjNKVd\nAJLNjTEVyWheBITyxw9dky4Fbaf1cXuS4O79qvL5VGjjKoDaLhrmPLEne8cd\njTuEZL0fnUQraTXsulaRFL9YKxRW/eVf8LTbpDTrf3ogGbwAXVZgSkUD+oo6\nd93w6KbgA/rjsSuG6Glek5S9LZF1TCjbVq1lq/awOMvnc9Wk83l6nhfU1/xU\nXsFvvOUum76Xge6wZbee0Pq632N/XMXBUbCq694xJ8ZoLlucq2i6IhbsDqfk\nqhzTV+oGtp9HM9RdxUxTk8YQdHVaPYEp9vTbcpaYs1jM1j0LzIS09Pi+wjnL\nefcUJofGWXhJ837UODRRsr9VsM3EXW/Wr8x0bUA2/OmSe3Lk4W1+x0UpCMQV\nBUVb8TXMxV3N0O3/pJxy8QH9YLJvm4P5F7CDMAbvnihNoN4atvxYa7xBdEuo\nH9WhJl2Xl7UXQPvq4CnvaFU1D1QU2qo3ddPrwt9uFibL0CTSus46z62xYgOn\nDu7evg2YKmei6+kF1aY7iHGGeM+wW2qZ6MiBTYTqBoskOjzm/mFZMsS1H/LD\nEMBHgPNeQ42v4iXFATa+6SjSLp1b4UFlbpbPmzPaSUWQmfbk7Pa53C4sC4fY\nOmaUYNXTqcHEbLMyWA6ulwLQtPm08ZnWOljoBXeLjKlCYKwwrssrUfdopqTR\nXSJ6\r\n=I5+S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDOMRxpaEazg74+IrEeGx0h/4pqdHRCryAQGG/OUeBr0gIgKydBK4QGPFcwbtJ8NHF+iYzL9XaunESz3UWgx/SvxTQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190719012332_1563499647580_0.12204768147109313"},"_hasShrinkwrap":false},"0.1.21-branch-heads.20190720000338":{"name":"@atomist/org-visualizer","version":"0.1.21-branch-heads.20190720000338","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"639f67fda72b56d45f4107a109fbe66c18a9a12a","_id":"@atomist/org-visualizer@0.1.21-branch-heads.20190720000338","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-oUxLUiP69UN6zYVV5Zq53t9/bOwbfaTKYfZk4PqAmEd9LGp5iAf5jm0LlxnMwN15q08k+S+p/xM0VCVYxpssMA==","shasum":"a870e7012e909e54d75e60367fc3af1b05f4a240","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-branch-heads.20190720000338.tgz","fileCount":240,"unpackedSize":3110899,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdMlu7CRA9TVsSAnZWagAAtFoP/jx1sQKNac0Ydly/yIZ7\nJyoIb+o79lCZMU/TPsbwHVon2KAZtYQKoLVS+1Gs3xFAXd+YJdCEaIHPAL/k\nbyEnjH+jdB/G85vztFuQUrs6G8PUlEEDon3mz0UiTriRI1O2liR7tDXiZKGZ\nhIgAxtTeam+VuBZI6bs0VsndV/XZNZXpKrslSH/LjuNIUfxrZNKqEr5vAHnY\nTMNQ/+wYt4SJY+dXdv2TuFeAJK134cFgYInwS+vkaPk5KUvKA80jkJqbvete\nipAFdsAHgyS3vC79ONAKt31s6m1P9q3+JdbL4Ee1wJNDBoPMaeEZQkytpsl2\n1WPu3Nd7Ux0UsdVJ72ic3X02rINCdGbobtF+KM40+xKmFNiNKV5wxJ85dZ46\ngGLHPpTHmIPJnRYM4RyxKLFj6q/MrN6oo5R3rR+2diMCcdLcoQv5BwAC9/6u\npwQ0au5oylwYmUY8nOG/K7cYrBuJwe4liN96ZGkK9LKSNblNdpWHGZzXDQHL\ng2i4PcpKmIo55uiY3PMZ+EBGvo01ZufMD1Dgx9HkqzCivXna+ApLbRAcShAD\nsdsVlM0fkVDMCUiy4kxpNy2m2atDDFkQOqtl48y/VMmIfmEtWcfRd683vQoe\ngfs+/atRb3RZh+6IwkuKgsErh9YXsK8SPyXfe1UOWpR2mTY002u5D99xaSoF\n82Yw\r\n=zgbh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+TeJD0rgGbjzQJF0gTjbBZOK70kr8/ouhXt23Eld1SgIhAOv6/jV/RgGnI2LVuVCDbbY5kKQlAQI0YMTqdN+KgiFy"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-branch-heads.20190720000338_1563581370318_0.2195171619245957"},"_hasShrinkwrap":false},"0.1.21-swagger.20190721004534":{"name":"@atomist/org-visualizer","version":"0.1.21-swagger.20190721004534","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","install":"^0.13.0","lodash":"^4.17.14","node-fetch":"^2.6.0","npm":"^6.10.1","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2ebcdaa8ad377ba469feb63b395930c8c87b6b68","_id":"@atomist/org-visualizer@0.1.21-swagger.20190721004534","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-l1jnQMBLeX481xPbqcAqdUJKamFtn5fgtOkuQ49N9dnTdj7PVa6omTvlQycq5YD9t+PU6NMNcXz/8KLqAIloXA==","shasum":"7e6ae2003317df2f8a86563621f872dc2904a7dd","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-swagger.20190721004534.tgz","fileCount":241,"unpackedSize":3113137,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdM7bNCRA9TVsSAnZWagAAU4gP/RSLLnXz1JsYX+d5iziZ\n7aPZf3UCdLi2gcfvHw4ebnQikQg59vkP55SqJoPNQFcr6oDBfWtjYDqpedcV\nZKJwljKY+xOWtp2QNYvRTnu26v91pv6BVR5MQBs4AP23vXsMkfpaBIwmY3yC\nyJ9zctih3YcsPMmNe7n+C2QKaPMeeHRFRTQC5gxb/YLvSivbdhxXdY5FnhjY\nvamvm6h/e3+FK+LjfHnd4XKwE7dk/7vEmHMCbDJGSsNOjbc7SKPf+DN4Aay9\nr2CB0tdcjjzXtR9R9N98CnhD3LUS9SFxYsdq54MgeDmgBtU+4LUwmIKGdlU6\nGDluVfv1BRyIONRzdnrVfS3A4CTVjCSCZ+21jJ5/6Z7d84gHIMc/HMdomtBD\nIxOEKBSucE+4UcKmhQwMVjmpb1cToGeumfXs8D8P9UJLdiRRklw18XTql6ar\n6WqfUcYQh6o8F9wo2jWR69IuENuVLNsUMu6RTve+DZoZfwwqIRnQbnrusaQl\nFR52+pHrCcSPiYDbWqfCH6hmy0i8mKaweo7xszlEzrft9xpT0IQwuOcoNkLw\nYiOd0/Y8C0U6SGays2Fm7VRhaUHpMLRNIN0gnC6IbWcPfMszbk6yA0aqcdyP\ndr35IH9bK7DBItJzh0foieMhE9De16H+DtEmP1Gmkc/I/YTNuPNjg16P3ywb\nfCdD\r\n=t/eA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID6pqPq21zlZ2ANG94UBqJeK5/QX9IATaID1Hye6AjpZAiEAy3b+/lR8gQhziInX8/gI2sC5wTgKUBYAjLxIZm400hQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-swagger.20190721004534_1563670220745_0.658459308868842"},"_hasShrinkwrap":false},"0.1.21-swagger.20190721085023":{"name":"@atomist/org-visualizer","version":"0.1.21-swagger.20190721085023","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","install":"^0.13.0","lodash":"^4.17.14","node-fetch":"^2.6.0","npm":"^6.10.1","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2f6bab3cf6483d2f17575abf05d2608a3739de17","_id":"@atomist/org-visualizer@0.1.21-swagger.20190721085023","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ICAzknXbDeVy/niA2flwSudGiMT423ZYRIS1cUARYSIJJThtPN2iEkznoKwbfHq1QIPOOfnja2aZ8RXS58uahw==","shasum":"acfc0680d2b4ca82229a90d31e1962931c70013d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-swagger.20190721085023.tgz","fileCount":241,"unpackedSize":3117360,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNCiXCRA9TVsSAnZWagAAbYoP/1/ieAq2Gol6g6xhz0Gt\ng/SR130rn/+1HXlggLdel4YnsWWC0+/BbQLfnDoglzAu1U0shSagypBVl1ci\nydiDrv62hiGXaWBngmnOQ/RWqAqsPYTgle6iMbLqAlugpiDMRUNrj1S0RNLS\ndCIq9nCJOx+LpWxNfMQLmaND3/b22Kjzbnx63TUFDe6kf6oi7gmSmcESxdxA\n1Vzg4h8gDisvYBSHTYgg5ZnPPhia+aj5yGtqCKgqlwxmsG6s5whJrzCyF12I\ntbXcbJm0aOpBtzjBiIOfUXtR2DDk5jJZohx6ZxefAvc0JAk8ciJ1YjpvcxtZ\n3V20HcxuLY4ftya/rFGTJWCFj9Xlu1Y4p5Rz4+zIrr+S9gu9/d21XKsDmXOZ\nDIkhygTKAYgJ5CfLCauM+p0CNC6ph4hp0EAbEa9pNp7gx7uqNT8QBk4Apu1g\npwL9MbS78f8PH2VYxMg+3WJ+DCjKX96WAnn466nkZd49hK6lCau2sFZgvSf9\nupFKJm3LAQ0+Nsb+1nEpVHfjQtI2Gqa9VAsZAonuh3ff8thm2yMYcW60bgac\nrU6bpLhJd6oANLJ4mD3++YAzb8LVGYgKQRx9YqhlB2qsvowcmGqFoOJWEfDs\nfYZqdi9KDko7uKzab+W40sX5BzSrnHDcHWsfvwYfqwxdhzem2i6mLknAnm9o\n3K35\r\n=7Sxe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF1+Tr1ok66gCjGdQ+s08srFK4ZwfBZSVIG66mXrESgwAiEAzmajnaN5TcWKiDcrLUcgoTchGSYWiCN7jNnR0U3rmfY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-swagger.20190721085023_1563699350698_0.14486229562106812"},"_hasShrinkwrap":false},"0.1.21-swagger.20190721232910":{"name":"@atomist/org-visualizer","version":"0.1.21-swagger.20190721232910","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"<p align=\"center\">\n  <img src=\"https://images.atomist.com/sdm/SDM-Logo-Dark.png\">\n</p>\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization.\n\nThe cloud native era has led to an explosion of repositories, which we lack tools for understanding and managing at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript level\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image skew\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface.\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them.\n2. **Query** functionality.\n3. Simple **UI** using static React and d3 exposing Sunburst charts.\n\nAll three layers are extensible and customizable.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7ca56fc0745a9d6224800d22950764daa82caa04","_id":"@atomist/org-visualizer@0.1.21-swagger.20190721232910","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-mbBOg7LAw+8Smtjj2eZgFZ/Z74rBrjWgV/Iy6Xj8/UZSPXDFNfXCZKrqBhFYo3daGDy64YAkqseG48VTaqrIGw==","shasum":"22e7b588428e3a9a95deaf3823c11869a0b47a89","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-swagger.20190721232910.tgz","fileCount":241,"unpackedSize":3117312,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNPaUCRA9TVsSAnZWagAAiA4QAIfR/UH6sq+npFL63cY+\nhEFIgFqkKkw6kTKTVEvdopF3Oib1c8hbnfTaasveGwQdbigpV4e75P4A+Pgy\nNTlSFHv40mOFAZffXDVsDzFReXQBJAbSn3/Y1yUL+PgK9tZaeM6riZyZqf2U\nRfgJ6x5e6Y7LshShMiKDdlHwVa19Zjsgt4dqCbDJxmSPVAiLboqob39SWAAu\nTi1/lPumRi/DA8GRjJFnakvm3RQmUJJcGtun1AQpbCfa1uKCpFtZen2Ohz4h\nZpM956XBlz3jRcWRSVhvDbNe6cj8oErsJcqsEYIXuWjstWUEXqE5Vvu4MAHM\n1WZl35zQuAxWTxerDffwhKyZQRdWPV0cbEVu34OFv0OaP4mRAGwK/K37W1Qd\nhlUaE10oGk0oCYiiH6k6ZjB+ZMkOAIdMzz1NMn2W69oXmtBxHtwAzmnpDU+f\n0WTPYoW5vFtk4Y2KIfgGNv4C0p6cF56sEJm/lRPmZYXc/0tGssx46zsoHBLi\n7LtxSSY0HUEN3SoS8k8q5IFtLfagccKXi+/4R3HWy9nh3xuEuCZUwzetSxSN\neXQdKeP3bSbekt1CNSTOMXJMqhmuRRqjbFSVpvVcbdiynoK/YWvtxDcWmaru\nGzlCKTGfekhOiHhuY3mmCjGW8QXZLNuH8QPae7F/WKY1tVuEOJClBjyHjeSh\nFJ/K\r\n=QfG5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDzYPHSZjnuwZ9fwEvStaLNRd8sJKQVZwrRI5TS1ygm1AiEAjjPku3yn2wOybGIytAWxY09JVepKpBzSJkE8zNc7lPY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-swagger.20190721232910_1563752083261_0.9719658088123544"},"_hasShrinkwrap":false},"0.1.21-master.20190722064327":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190722064327","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0df4ada9a3fe7c69d1a260b2e87efe98f111567d","_id":"@atomist/org-visualizer@0.1.21-master.20190722064327","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-FmcH8a543VYKJygdwo+NnlYM65THoKGw58BkqDiTT9Vb9nD5hS4dWdRjxOYAKoZBKrYQD2YwcjHxB2A67dhcPA==","shasum":"3e1b9f434c5e07620ab6d8ec420dab9ccc32dfd8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190722064327.tgz","fileCount":241,"unpackedSize":3117932,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNVxICRA9TVsSAnZWagAADGwP/R/ubObBZIjSpyDgG5dR\nnUpUJY8/Rb3ls9GaNVhz/9aBlqmGY5JoGdMFOC9mLfNqNgUxOq7akY7JIgSm\ndfkA54Ffp3wAWRZhi1soWeia+o0Mx7KWo3B1gRIQI48FfqC4IKa3XeOL9LlS\nO6PzGYQF1KxTa5vBvVOg3viCidrfL+CJFlIZNNPK1HjYCGjc/Yyo6ZgQ2/Bh\nc/1EZqn0TGPIu8CgY5pfI1S9t57ot4O0AKWFUn0iCIbzWeP9VlmtDeaWKt1u\nNg0z8OpdZLkw/3FtfRTOSAEs5XUtmdtOpaD9iKdWIq9jZ2ivuc3OXuukGXQ7\nFPKldzdwypRfNlBw/w1bLSAGOrRfduyMfVp/347s6zm16ZQ+9yGP+ukETvMy\nP45lDmW/ciuqYlBKe91wUyntqjpHkz+Ipz0tZN5Jl0rA487I3MpFiaHv4+Zm\nIOdYem5rgS8nfMNtyfKmlT9+UEuCfhiaBWp7SRYCKQxI3tpvRd9g26GGEBUs\nvFWe07rxf1u5BJRQAKkj/2BmRCPWGZdJAF1lrvxxcJo1zRBf0im8Orzjj6X7\n+3UVUL/OH8tjv2XYBIJHeHDlndeVK3JRFUArFYmguTQDX1YHjHQRq9y/AxGx\nVa9Qf+QKA+HggCZMC+OESVWq6B9ZzRVoAdMupCrlxCHP+B2PzJsxUkVQQuAK\nHbwA\r\n=cFnb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSauz0gkCFWFGTVduxOhA2uQUA3TWJr95PW+ZwCQhpJQIhAMpsFZXKZrC5QEYHDRhzoP8069JbXw0nrGbMwNISTqeS"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190722064327_1563778119172_0.9556783747435358"},"_hasShrinkwrap":false},"0.1.21-master.20190722185433":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190722185433","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9a0c8c6b052731ce4ed4c5f8bd324378eefb6949","_id":"@atomist/org-visualizer@0.1.21-master.20190722185433","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-lU0ojqLnrd3SC1rgyiXHmYAkflvN53vWIuJxMDMvCTnPS+BcyiSieerBWODehhijDK3XnFzlu6kBlb3vMKHTsA==","shasum":"4692460437bc2a95db353629b05d173d62d13f8f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190722185433.tgz","fileCount":241,"unpackedSize":3118167,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNgfGCRA9TVsSAnZWagAAgzYP/1l9q2R7EjK/YGr3PffM\nr04mq293vPjwypmNSziClbr7qoicxSdHJ0lKFZMDDQ1iZS8/II1HQt8GJNiZ\nDZSjErRkYsNcF050cuu5cPwn4DeBUw9aTh/cOKErHWElMPGrwBito/MdS8Ms\n/xjbD6Vp75S8j+NodM/9iPVtn7+8yY+mkj841mJXa4w84nJ2QiJMwkltbrsh\n/A1ZEoUjPhdO19/cOTuW62d1KcVXpjZ8ytTgf+8wJoeAq00wOWAoUHWLPvxz\nKnAexZILJAaME11pViDA40/milpg/Wq/OH1o3jIksaZ11OagAihbLXYAsey6\n77pk1LL7mFSuuggrmqss3W2Ianq0WmDGdESEgDFvjMutIgAlcp1OsZOpy6dJ\nO20G1zkmUO/cKZF8oFsK2jAhMRqKFr1ggEQ7bGOLsDPd8oj6DbSbQXI6ylvQ\ns6imSGvO5ybuZs+fhudgSuTJ1cwMBI7F48aeUkYn+c36ExoL8aYjESiTVVOn\nXg+slatGg0yaJGddrFmemxMQouvLTBb3zxlHpGbi8O4QyacGKXKSCbTJS8lz\nWDR2gxYesnjlXQ2HP59DpSkWYCXQHU7jbhyvM3+SUn7XAZ00dqfO39prFQkT\n9NBkAFc7Yl0nuE33kUnXjPyK9E1U6kZHQh+Bt3aHmPlHQLSNM5hxQF6mp72r\nruk2\r\n=WLMg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDDbxJ+VZoz2c6SuoCXF15s6DhSZIYVxs68sL049+gtAwIgGmtQAiHHIgVaQjYqg22sHZ/JKpqaU/7BrcJfIVdwW8g="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190722185433_1563822021765_0.8043495117839596"},"_hasShrinkwrap":false},"0.1.21-master.20190722221046":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190722221046","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"dd1ab8b43e21c49ec4f4d422894234f05631d006","_id":"@atomist/org-visualizer@0.1.21-master.20190722221046","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-VLvApIhoFMnJ6BJFIaHMDwnPCHzc40Hz7wJ17UeydBC/pLzvxpBnpz9KgsI5OQzrMdvv2g1v652vQHJwiRn8DA==","shasum":"235dfccd09a86f84bf346784f798b36df20727b2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190722221046.tgz","fileCount":241,"unpackedSize":3123846,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNjVtCRA9TVsSAnZWagAAJ3EQAJ04JSlAq9gKWYRq9i2l\nwzOgYj6QZYe3wxDBxoEP1yJ7cki6T24uA+8Aw/amouOAYQbIrzD9aQVNkuUH\ntpsZ31GMWUO8cSaRJk+ATIuNBGlsqDkBzwdirG6lhKU32UpGfn/0uPQuSF9M\n34bHmBpHe4x+MRWBg6cK0XxGu4LFDGdL+/iQhYaCp9++8fzreNn5SnJrat3X\nUeiCMyhishJee6slwrfvBzX6kPS9vitwE80EI+HqYWJ2A6MIkFKNr7QJh0As\n9HaT+GftdK5ok5kKV94NiSQZHfDKTZuIY+N1DybqKtAJHD/0nMPuffZ2XtWJ\nuouM2qUL9vDtFBa4FNdZtAF4lVi8Hxk0Ce55GwdfIAda0k3KHt/B78b83n7X\ntE9ED9CsUHRAiVSdEeGX+4AcKCLWvpjoC9QxWyUxlO+2ClaGBfF/a1Iu7EVD\nVXtpwC5Nv7xMIJRMRCigKtq88o4Dia7h5nPpY1pSYLBSaHtLDKH6ajeYmVup\n3f8JPeKd76OcMA/TBuqJ83Ce4wvrrfprnlr8CC3mR/7of3NaX3FzzpzQn5s0\n06FF1u22MvKxxB4UPwtP3HDMizEXZJW2YuLE/qi0CGzhoXNco1nlwF4tmnkD\nIxZ9Q/gBX0sueY9Rl4kgQw/LBKBJcrU16H3Q9BL8rhvmzQSP1XyjUEA/6AwW\nelC5\r\n=UAHi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD87bNjJpI6zKZIqHzLtNOZYRJQ3cqNTD7T8bFFs5KgsQIgEVQ1qkZ4jHSXwdROyabjQ9IvYswkWfCOh8PeSJKCwI0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190722221046_1563833708395_0.45527473085379744"},"_hasShrinkwrap":false},"0.1.21-master.20190722221524":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190722221524","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"06fceb287125b88a246fa7fe5d77ae37316a0d06","_id":"@atomist/org-visualizer@0.1.21-master.20190722221524","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-TYLT68hL6lKNTQ/4R0/oHt8x1OKEl8SdcpM/Pu/aI1CxiN7xJc5silDig/Cg3N3tYzDAoN8zQ8RBWN1qsf98uQ==","shasum":"57ab7d88deacef4d77098b08e5d828b0b46e523b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190722221524.tgz","fileCount":241,"unpackedSize":3123846,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNjcDCRA9TVsSAnZWagAAj38P/29n5dP8esogPYnyI0W3\ntbLzh05qnj2+LkuxhUDXWgWVy5G6pJIdTeqM0DCRrAmX01OTfB7xvSgC/I04\nFP+QT/wbB2gv1yUyuoctJCO10UVOiLMifakjUPCXNr8WnjR+9grReFStUIWQ\nA61/6PyoumUGOw7hd270dwZrEkMLlGa1Os1/fuzJT4WCzipX9jZJW4ein1b3\neemR0pm9qOxipjkRjGzm0+bYAGBCykQxQzCirnUAX+Y1r3OSa5ASSnM+tlot\nyemkl9uTfdid03lTs0ELXjEAeFz/2Y2H9oGgyBRF2PTx2yFjUm6cecfWP5fn\njGaqkR/D7eWqv2wliODC5WBNDIik+NplBPGk0ncYnNN/2w+2jiz7wZWqaCYF\nJ7HEIhIc2w51mnvq9sTp0Y/3XecBPYEwawNtpamQ5Foor3k/e4tJ8N41EYVW\n18ctSGMxv3B4BMBXo8o/4mByKSMEBbFkpDQFkutSI8lEafzD+LtPEr6WcYFM\n3MPo4iOFrbX9/v30Btx+z5sqm0b0PUwCugayWwcdIZMq04oYsAOzHnQ7JqeF\nFY+7p579bOXOGfH+1luOoJHhzv4tv32UR5jdebHTTYBqbd3cmTpjNuoMb4hN\n1c/aO1Sig0yhbIz4x1BcLpXuNnH98UcYAqKvIIDzRfbEwvgLug7KSzND4paY\nBYrj\r\n=9A02\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDttg7qp193pJ9OsHb39K4YgYUR4wTeHVwGI2RPZJ5OTQIhAO8V/jHNUknIuFwF1TwVAvJN+oos2cLRxoM8tHxTTrq4"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190722221524_1563834114410_0.2002489407762451"},"_hasShrinkwrap":false},"0.1.21-master.20190722222708":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190722222708","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"277a31a621fa9301a26cc9fb055b74aff7fe8ad8","_id":"@atomist/org-visualizer@0.1.21-master.20190722222708","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-o40twMHs3X2yVF7n6MKiI3eB9Zyt2XeSh79dRmPwxvi6D5NO2yGE5TqavtAYW11miDvlI82YnNpDcDIrNaPW2g==","shasum":"d8a42c8e82ac7b5c86f25507f6d57acde1ea2960","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190722222708.tgz","fileCount":241,"unpackedSize":3127424,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNjj6CRA9TVsSAnZWagAASCAP/0Aiy0Th8VMVgTPLzTP8\nN7BDeyFAW6gLIJBaCDCvDnY6/2Kc+Yw8x3wj8VZSceUYdkWeYPjRLSoxFWpE\nLtKfMl3ntUT1k09YC9/qx8GnuDjlPzRlhIJpqv/qk8LMebCeI9gi3KrJuE2i\nblvphOJaHlv12e1ZH4WaCue1LDwDPTeq+VI6UL8ymxlHay/kmfTk7pMpdgEf\nfS2QStRSYpHrq02rKsB9+L17H9zLS0oAeDNia82C0m+qTmLr40+nbAs8JuQp\nhrXVmjRBYLo7wlUVW4wZ0M52YPKsPVCnc+Y9G3kc6BcJhBICWhweY0TbDz4t\nlbB2VxPafYI5h97FE30iqeylerSEsqGmDmiXhg0icxKLpLem+dOtBEdrdsUc\nJV1/w5+JV0JIUaiPLwPQ2375U+ZhdJCWYbb2BPxo2AH4oeY0C3Uh5AXfSsGg\nLwqfMNNSMbuIDFc8dneBrmTVukv2RKT3k/BtsnyvRCaPcDreIbaSy5EOhlmY\ngf96FeXo62Yckl7nSAauopTS3C/+MuLTEJMw1bHMQd6cT8JiDnNWcgF2gpBS\nuf+7VKXCzR2tzJi1QQh2aSXJ3XQhoGKpA6LAo69YLm24v13i8JB7IplENnmg\nQhkzPQBMoYR8U0jUQjTKt66lNBvmfoqDo7MF1APpBJAV8U1ZDLjCViEKxge4\nKHA1\r\n=D+ny\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIApkYp2ZAINwZ14PzNK+Z+ih5QrmK6oPz6ZlLaxPX7WSAiEAgWqmWk5Z0nzh4gJzXHoPYyshV427iTimOa8LcKS8bBE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190722222708_1563834617649_0.9733596691164186"},"_hasShrinkwrap":false},"0.1.21-master.20190722223108":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190722223108","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"277a31a621fa9301a26cc9fb055b74aff7fe8ad8","_id":"@atomist/org-visualizer@0.1.21-master.20190722223108","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-xqOTvnAuBp3+JkTSeR9uHeqpVHyn/OpVOi2lfrE6wjrtyT79AMpvmiXjYTH7SHekfO3nCHT3FteRK/MG2G60JA==","shasum":"126ba8b8077711c929f41b9418dc775e3f389c1b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190722223108.tgz","fileCount":241,"unpackedSize":3127424,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNjpPCRA9TVsSAnZWagAAQF8P/Am4JlFPkU8DmZ8e6GVO\nKGx9rq9RaJUWAElRtNLGZz1Or3g2/KGgDYVbeSVRaTfPKU5AU0IxPCcJQvNT\n4EPyuDUHjkakfrr1sBLCdrGGJgoh5OWtVelJ/DW+flu7w87eLZn5Mt8OmWaR\n1uv9U+lRUzDceGZVVjM6q8CeT2k40wMQDO+T7bhgBUA18Zokf89Kw9mf0dqg\nikwTu+ubMdmpn5pcvrHnov5DMHf+z9udxCCHS1RHa6SrzRKYUrRQdOgxIEFm\njiYU/b4/MSzl/GLpsH9zOtFW5qse/IuCh/bNDZULqXCbCxcx3qSj/kz/YLyF\no5n9XnbFLEfG8djFYWy2uzO8iHPgzpxv5Cf1fhq27zZ95q4+LnhRrSu+dgGc\nxpxiNzmaDEZArxKwxRmaRPTt95q36w76n4aZKXdDPx52BqxapDcZNaOdTN0J\nUFBOPAsLVrJxvj19CQ5Rykl1lyoTFp+1A34iJ0/3QsHb7xS5gjS3zBP2lvNf\neMbhMY57lfP4ThNgqQXm4kxCyT17uKff8HUdMvWGfguEvjx5zCtLV5H0ctdG\nZDi/kkT5Q6GLsCEIuPqoY3Cot3l4SXGSENjnlOYLfIY0iB6mBtsdebHbAu3X\nf7vfDZ2WcAvkZQPP7PcM1xvqgHGq9KOfuWAiPZf04QHWek2iJ3F8BMmOnND5\nt2HT\r\n=RJl4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGXAgpiULXhy7qjKwQgO9MDMsymJcLYoYjOqLWiQxn2tAiEA7474Ksznu24RTJwNonDKSlik7S6SwHGvlhWXucMxGw8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190722223108_1563834959149_0.179655939229447"},"_hasShrinkwrap":false},"0.1.21-master.20190722223517":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190722223517","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cd01d1e506556c02777c43b614f70179b56a309d","_id":"@atomist/org-visualizer@0.1.21-master.20190722223517","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-5x7Q34rslOzvb3AqKbECHqqVxtxX405mFqycqHrG8DWu5EUGtFD2KOE2plsG6Hnk8GAqDdHAhWy90aki2t5I0g==","shasum":"18da5e7101d1d3ab5cdd5d033ee82a8a1fe87f0f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190722223517.tgz","fileCount":241,"unpackedSize":3127493,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNjteCRA9TVsSAnZWagAACg8QAIodnsaHNe29icNGJp5h\nnX5UDLGRQezLXcNv5m2nKlDgI7jMnf1nLsFCiwC9vD8VhqZl/tIvoo3ej0uW\neeAy3/z9LaSyxs4d7Rg1KnQOcVTlybHaUsRNOXlOHI7wlkjBTeOsJf9FKK6Z\n099WcfTtpuaG04lnaW5pP4xoLPu+oh31wXrwyJXwmV9iZotobSqNAgZiwj2P\nqSCJYWFDVhHOznXQV9PnvxY9WzUhgDM8FVt9LTLFWoaQTbbPg3oEklhBjBbp\n9qAeMZo508UvnNUhvaxVkBf5SQ6nkO37lJ+i2aV859XNxZ6Rgol8CpeubzjN\nAC76u6OIg5W40jZSb/eGso618nW0P127U/x22M3/o5RKIiMUyx+Ch8BTyJKx\n0bAdazW6Nq+yaukK06uaRTnNh658oEKG8OKhTIineWsoGu7MC4Frb5DgWcIp\nFfeLV/ruybZvjgYkoRIixaFnZN6udK9kGPQxJjVQac9ebpIQXEf+le4p70fm\nXH0nlCzhhQYeBT/g4bJOnXPLlACWcS1lx6Lc0Z2p26yKFJF96RYzIGTKr7uX\n48FLWGzNlQSsGVsocSKrGLbxdODevTWdaulYhPmDi5QxrQ9+E/NbSnlM9ZTJ\nBLJ8xOJDIDxEbjKIwLXGNzDz/bbPdHti3KNYIv+cAKn52kaoUJ7g4/KUWMXY\n/yLp\r\n=vhN8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBQn48EBsHliVA3S1eNY9ceVhHwXq07cuAKiaezKozU6AiB9XtKcUZSP43uTcPHkae7ACOKHmfZ3dMUnaP84tYDrJQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190722223517_1563835229946_0.31846201396563334"},"_hasShrinkwrap":false},"0.1.21-master.20190722233555":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190722233555","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5cc4d49cfe1420fc8bee602a9cafd98f68610552","_id":"@atomist/org-visualizer@0.1.21-master.20190722233555","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-RnKx/C8Zfi5+aJ9T+XreNTYp6A/jQssTsuj775xi1UZax0Dnc7tR5PIGGM0eUJxGp8O5d/6jZ7Fe1OMnf0d+dQ==","shasum":"f140b13cbcec833a937d12a8a6cb28f38eb9171c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190722233555.tgz","fileCount":241,"unpackedSize":3128218,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNknACRA9TVsSAnZWagAAL8QQAJI4TdDC3edzBAUMQNjD\nkkRZ9xCAV0ex/LM8FySWteEdtZIoFYHVQd2ijL/PtO/xvtkgwF3giGcHAXjI\niqVRFGSBdy1+OLGfNX/gZFrPOQklSb2tIGBK26Vz46/6t3fqwUVe55JFKlw9\nIN+invgEsr5v0Thsf5VNp+UAJf/+5PSOSak0WmDa6I0uAgGVAw4/TRq5GdCp\nTqqe6Ts//TOUkhPLNB6wQBH25CAnxqjIQUTTr9Tw9O9q20L4S/td3QCFMIl5\nvk8tgwFyR83NxorfCp3BnYMuKlx8glaMAv9diBKs+scMdfUDJBDdB92ZrLrz\n4Y+64VauLi6c2Ey+KGODDPfhgMnOfOZE/IuF7kD21aHDAb1jjfB1Y1bycIPD\n5sVK8KoE2kMKb9IAO7Z1xTWkrugEwjAU6B6yR6owpfXlWXzsgf3X4FnJEUJO\nXzj7enPORzObQLrjfce6PBGPWb72ZPrYWCLWo/uFZ2NqE1bcKHtZQHmkd/rl\nIkuCC6GwqvzkgKaBUaBqoPo1zHc4xMh8YtALv5nGAO3lL3VW68Ga53VGDVP1\n3diVXU5SsQU9+oiDwQXW7uknSYaCXu8ZKwgk7PlggLh48g6X82hFoxoAtC3M\ndR7L7hCRpze9/qYc/uKrLAbiRF72bXoboIahhnVpp10et5NNjwP+PwUX7qaD\nEyxE\r\n=8+P4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEuQD5RxAzTWXcGXjw9rrPQK/tMNkMn5WtjEhG2f7i1xAiEA+RP7xVUdYRCvp+FXzNHqkAtf2gfk/qmDwf3g9W4IMfU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190722233555_1563838911744_0.5549085780482097"},"_hasShrinkwrap":false},"0.1.21-master.20190723041041":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190723041041","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"536b78ab0670c2b427502e3cf36de4d41434e882","_id":"@atomist/org-visualizer@0.1.21-master.20190723041041","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ShmWeNjt0PGafStL0HrWgQYuYNqraW9lGAYZkVFuZVcNKmeeVdM+wKkYL5w62PN4WzC581GzhkCkZ1zC8yx3+w==","shasum":"1a0e54e537e94e5775657367309a063e42b85048","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190723041041.tgz","fileCount":241,"unpackedSize":3133460,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNomwCRA9TVsSAnZWagAAGUsP/1sJoB9aGCcbD8DE0cjm\nbWMtg4QsdH5iuV/yEtnEImsi78cxc5jo14abPB4gHA9Ubz81ZidB1uP+RnNE\nEdI4mdQzxRm7QsodPFwMp5+RK+j6roJNKC91YkIWcV82Ic+6kMPNRJ3K6oDn\n2+omTpLNb5p2jAZ/1AKvVscf9x8C4bHmy/E8nPyGFaX+7w2XhuKZUcNiDmYY\n2/HrRQQ0mImOyq/RBPtgyHElGRFsojXCxQSIvXmml8qvLFJRJVUUQzhJEjKF\n+NZQenICQNaMJGBp+9yJBn/5QXf6bGAHzoCRCiW5Az2ODqV2m5wi/chrGHCL\na7dnaOB4eRXlAE4FHSsskAyHNn0p3cv6cFz49qYC3v2U9juahUancl6hQQb7\nhK7wSJIR82Yi2lZ2MjF0BlsPmgCs9xmG1jH/pZkRzfr85za80plof/YitZgr\nPrugAJYSNByiU2L9MlDAd19h92Otl6tOuv94p5YY5LJQuHUG0MbwFsTRhvx8\nxlia5RRcVVxwvUyDouI3whvXMK6f5oiM4Di2/K4sXdl4XhgLI7yIB77KAy3M\nrMLpxVEGoavJ9lKzCUovZ9I3NDm9QvymsATPzR7eB1oeARj8xnhJKnEC0VZ/\niXnVLizoWmWXpARiZXOB3vXWzi9ptxZyEe+Zr6Wap/i97NH2bbz2984irjEp\nNcii\r\n=22b8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEooNfVgsvtdd8/tEUpIWIOjxkEr9FQxjw0e+Wy6jNQcAiBg4RO4urd1d3zpvLf5xPmtPFrk0LOZL+1VDG5p7/SdbA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190723041041_1563855279572_0.6697637031677921"},"_hasShrinkwrap":false},"0.1.21-master.20190723073645":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190723073645","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2a4c7240f3e30dc1fe4209b241fc94d085702182","_id":"@atomist/org-visualizer@0.1.21-master.20190723073645","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-JZrisOdmNbcLPNU5uAzMVoXdkJEU390gtTA8/HJ5sgLqNWg1CfoB3cNVKK5c0CA73YjOG8W0L4CA+SHXsQuJKg==","shasum":"345e37731228d2b77d220f40a41b5caf62551723","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190723073645.tgz","fileCount":241,"unpackedSize":3139414,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNrohCRA9TVsSAnZWagAAhPcP/3v/7EEnfwqAGe8wRSFY\nf1EVBmjTybhcAG3oGLKxLnaTLLTEhraPnL+I/kygkiREb2ZJzs5QyFaMdB7N\nKjljjzS4mGvc+LW7ZsjLyRavshiO8maX+VUFqbAxPAEbqN8P2TZK6nowEkOa\nN9PaZ/gcTmR/zjQ3b1BzcJnKdBLUZ9mEgTDW4bOW94O1ug8o2kx1OO/vmr8/\ndgncJ4EiF2RPGXeIkghaieow61wuKZ9hVAfvin06p/2wjLa4zQK7VB7OmBUL\nib7+B9tW7xnZBD9lt+i1rLoY9shHF/xkNjCB8gJ9rcxmKnMPEoxvqEadt8gT\n+8lC0Ne8lVSw3WQRFx6VXS8E2evKBI89efDBw+gHJqeQ9vihed1er4mx0PTY\nQdupqpr+t/Uh/lTPFcE3dz/JCuoWs6hDRUX3grDoUKZvEfNrwx/Zld9iYjef\nBQgFmWMcrHez55K8qLXcyANhbtFxrEGpif4KQ76epYMe6iHGP0ZtyW5aKF+A\ncxSSJamwpfpQDQdaYttF+UBj0R2fXhfFvB/G35jpdBb4D2JFzANJ6CCiV8Vb\nEevJTpiItuFRMguZ9XiB2YgqLg40ETJgiGJspves+AnAZPBzVZCYj+z510+U\nmLRURmTo6Kyw+gVE4qM3al3ZNlLOgeEM4JftvhBc6t9fGLpirHAXKQpH++Mq\nqMZw\r\n=XnSa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICeg22TMRGNkd+97KGqHl1rSO78igmvigIozv90OR7fNAiA0603xGb4sW1tsSLzG8jxpxu85NqtfoK8Pd/ClkCLy9A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190723073645_1563867681021_0.26866547410532604"},"_hasShrinkwrap":false},"0.1.21-master.20190723121028":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190723121028","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0fbc836a9c7c5e25709d084434d18f7f080527a5","_id":"@atomist/org-visualizer@0.1.21-master.20190723121028","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-eCX9aC/oE8OOYclXzgQd3PM8GkkobMNyviqn3rWpE/X7wNfEcOQkIEcLJy+wSAbiGjPzcaC8HnO/rOg/9QAQzw==","shasum":"3f3db9755bf134cc22226947b1de491da12c89a8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190723121028.tgz","fileCount":241,"unpackedSize":3141725,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNvqGCRA9TVsSAnZWagAAWLoP/AjplUgiToao/IhYQia8\n/J/7bJGEiyjfmqn5BSJyYaCiAqnH+BtygUd58a7Fafb3dgL+xlvcMVXLLsEY\nglDP3X1Ah20GhgMBLmNUse5oNooOXTAGDZAzIbZM5V0AX+KmzZ1h2NXuwMXT\n8FVjSFXy4MQ38aXkWGJSOfvklr6PnF7J0NtPmVQ6vt6g/bP2cw4OU/qt6dR1\nBcNQpehefD0cmwTorUaB9MPSEAJYmzm9z5xitQQHEfdzpeHOMHeKlcE2BFIx\npzOS5r8V0Us6TAmFAjd8VmCvEUKMgc9yIQ1+gberYmNv4zuveLL3sK5jxldJ\nFCYFfxPx+Tx8ti6QGgpCjMXeDZfw4Zc8hpNnzk/hjP8V+i/k2Vu6miTGj6e7\nAD3qerIMjTcfQO1t0OQQlESWcQL8ptbdTEwYbGxSEzRAnVZn8GQQEdrvymzR\nAqpdGse9BOSLpG7k61o68v38Bb+Y/ilhQnzkAm61aiPp++rb38lRvldPvlVZ\naK9hBHTJrDK86c2NcG7ml5fo/L1uX2uzgdCTJbqES40kjVU+IyvbMa6z8z3C\n+JJCZKNSXg02IEIr6qmVzMoSu54ewWjIGJ+LhYKveA8+0nEmWh5pVijtJFli\nyhm8vEQGPC+Z1E1ssaoNfzFv6nbYa6q1dWZoQh1lg2TjyUlSE6psmQNzudhg\n9Vkd\r\n=3pWQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID8Ae6DKDmWShuNOV9ELpsbqp7yAMK0bzo0tBO3nJBI9AiA4MabVJ2pOuQdUCRz74qIb/pUMMjN1RntuZqOglzqygg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190723121028_1563884165425_0.9267275068190006"},"_hasShrinkwrap":false},"0.1.21-master.20190723122423":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190723122423","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.2","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-master.20190511162233","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f33ff11f2538c067d37be35414f945f1e776cd3e","_id":"@atomist/org-visualizer@0.1.21-master.20190723122423","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-3sss3un6XZWsBDifNiSU+iEzeKJp1O0JJ9K7Rd71YG3e6SJGnq86pyTVIPpPVwXMYjuRgkKIoDgRVE9ihiwxdg==","shasum":"2b59e74afc3637702d25109153782bbefaa4fb6d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190723122423.tgz","fileCount":241,"unpackedSize":3141424,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNv1rCRA9TVsSAnZWagAAba8QAIj0sP/kAc5jOhG87/DX\ncDmH+hlrra9K0XL5tWMQ/VECD3e7vNIoB+wig3imLbNGZc3UhpPHE0NN9H41\nYXv0AZj7RkZcq4F0n9ulK92/25m6EDiCVOdrrmoYjW/B1gpwOdgof+rMFyz5\nTuvWzyOjgtBDbCt23rI/ArK8Nl4KHPDTd/uYskp9EIC69+Bs+NvAPHx2S5ir\n8cFtuMM+Gj28G8BQ7XZqK4lw6vvMFZCC9e0HuRiwgRnZI5Pb7DJedFUvKWlV\nSYkMk/7u5ZIE5oL38EVvy4w3vnIvsSp0x+vE7q9RhQiB8OePcerNYEp+DlN2\neO1gOUSGFhbf0fY/IocakSvgZnxSvGWU3+tdc1Uh01YFeEtaeOjiZj9dwsLh\nqmxkyYFwa+QfT+r6EIE3IYDFBhAOo+O+QfDt6Lqp9+19pJ/+4VPdOAq19cWT\nyR4B5+830NhHR4HVZk5iEsyV2L76+8T4UdhIf1ypik/D5W/ZLMmVug9j75YC\nCiq/VB/zB//3Z43zZ1mkrWZZO77vltsNaGlfSKpUpGF0wMbBDTp8iAa9Q3KD\noD2CBElQyJEQRAoPEEuyekzd0c8PNplcWlU8eOeXUWeJ11k6rlyKv9QKB75L\n2l5Tnzr2LqHLn8zPU1iKpjRhk058qndERsWtiBuggD8ZPP4LLNJaCEtRQwZb\nxDx2\r\n=Ddpi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDWLMaNmUQeYb6D5o+3D4CCDYbeBTpSJ61y5D46gtleHgIgY3pNB7MvQ9up2QSLz9X7/720cFqBdAf8E1p4rHUl+3U="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190723122423_1563884906858_0.5488469250760761"},"_hasShrinkwrap":false},"0.1.21-master.20190723155434":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190723155434","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"20d4cadb69582ea968dc80b873ac24a89b70de91","_id":"@atomist/org-visualizer@0.1.21-master.20190723155434","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-hOtrkg/TuC5Ll/rQpD2Z+Qyi6Jbc9H1MnY+bSk8WtF3BVlVjcm6CPVj0LEYW1QOqPRj/1v/4/BlizOysaz+u+w==","shasum":"241db68b09c825acece28dd01668671a536eb810","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190723155434.tgz","fileCount":241,"unpackedSize":3140131,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNy8uCRA9TVsSAnZWagAAWnwP/2rd8H6y+h4ydH+fu7JK\n3jeeFX4Z+ZQkYTeCoT4oLTldd0d2B9k8D77FsgesWyuYWmUiVCk2vfGwHi0Q\n4KMAiODsPZvJRDR/68T7MyerZ+GNnpB1TSHL4oEu/XpTQQKU+Otdch8RuV7y\nl0xXGE2OSo6F7arBIlE9rgsIChXmco5jsEzVG7t+u5fugaC9Kv2M+hhfIvX6\n3I/ljNUkW5ejUIGZrIYHCQMZaO5vVGz8MmjtFzVTz6Ts7g1p3LOCLPSHebMf\nzYEyo90G/fMniyGvRZhiiHaAQh/x/823YdHVZeuL0OjFaa8J787wP3iNHbAS\npgz7Zjcmj9ZquR6WmcKd1AEPEP2XD0swhxHnQ++w2LcC0WoZ0mj7+ojxF0P9\n47zyV1zqB69u9FTZYuwdWkw1bXVk7vCHGTcrvqkjOF6zauC/i2sztlQsnCgL\n4tlOludd1dWTEfSERGyPGMQvcJBDmIxkFeRZDN88UTNQCru7UViaZsMlT5mR\nvpaFpos/XtgJG7n3Y8ebMdkGhco8J0mGXxJJL79a2ukxIIsI+/6Ih8ToMlAA\nxVYBtlesVAh9CTSnCS4nAhbn7kjzzn83aGWC7j+Nvihv/E7fYW+Xt1QBTdv5\nmR6m5xtm/+2Il73hVi2rgJVXt5W5UfXFXfvPWcRjGtF+oLmwUm6+8S0moXWK\nD3U3\r\n=UMtF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE4YLGvvaX58CpI1R+UHG9ZGQbgItJXuWW9Cxf6yO/6cAiA8wk1N2GxobgzZzTrppH6FeBfoXlkJw2443kDgumf6fg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190723155434_1563897646083_0.15111583709206955"},"_hasShrinkwrap":false},"0.1.21-master.20190723190848":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190723190848","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e979fd7b08d5eb6bf1ffd21f2ea69f8b21d2f7df","_id":"@atomist/org-visualizer@0.1.21-master.20190723190848","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-EzIDtlSAFNqP4OKByILBH5nWsNxO4+76iagLzjyDb0GEZhYjMieRItK0hZgVpR68hxzvV1bk67Ne/w98AU9LLQ==","shasum":"27afe1c307f6928b819745999a4e4bc14e976911","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190723190848.tgz","fileCount":241,"unpackedSize":3140054,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdN1xhCRA9TVsSAnZWagAAf5cP/0yQS6WU8XqlT0Jw+12H\nPXEKyDS0ivT07nLicfeH/gJ3QNX/8MW+yLGLEVEknSbPkljnKHzOenALsD+4\nlcjQtlglQodVbBObgGmNffVmVHHMI00ir4jl5OqdDg/SVW7r+FeBT3eLGqjg\nrX2xCsbiPFuw6wNC6fB6Uoi53d2GC5Q9gvIHbYJbZUMp3KUe7z0RxEyYsG/v\ntqI8PbjCnFbq8kmZStZh3JNoN3uLav2qNZTvewO5ZRdAm4yxWSn2DJ305nBH\neS/wAo3KzdtknGRMP7Rb/2cGD9sMlFb12madaa1UEEF0ZVvz1i5rlB1eKwHQ\n5YAGBAhPTl+0Pwe+e7aotbqlm/2PczFH+fQBvFFj7EqwTBp7LKOKaDCD0rGn\nV2tFcdFd4lWcmkEP9VZq2SVqdK841luzyRsy9k1kkQmQy9dkdK1jw3EZnk1G\nAqJb0+ldVpvWDmjpVrXbaz1CvgvuuIvIS9CRxHu7+47okKIhsVEQX4Su4tI2\nsXafQAat3sZKK5oqHr9zMfqx02uv/mSncxf8mpP8rCBGL7IFKiTZXeM58Sl9\nemlcUKsXqJvw1N9stiLbiffj9XGXDNRCNLUI9XeSPstWsH4FUO49bRKPbkxb\n/R4G7sFpqYqPjeKOmUxvo3NBzkFZV0DHwKQ8MqjXn35EG90PPGSJBlsuQPOW\nIX6M\r\n=EEJU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGWz0w/L7MJMiIZnaXuu5rdxY/GrFsG8fj3u53+Z3uTdAiEAsiOcKa8ILBPsxBshy6fxlhTPtqHzKrgdql/4qG63n2g="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190723190848_1563909216561_0.11593464817858856"},"_hasShrinkwrap":false},"0.1.21-master.20190723195958":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190723195958","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"66dfb4c9a6a3d6bf137b5f984d281098bb785686","_id":"@atomist/org-visualizer@0.1.21-master.20190723195958","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-KGArIwgNs/QyVzUdq12teQs9RSecimO5jAJS9tugeSaDPGNyzNpq2KrVruuj97rA6WcNuIXjwm9mdRAP7EeFEQ==","shasum":"4ed5429fd8158f03d41e1437b46ded5a2b252a44","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190723195958.tgz","fileCount":241,"unpackedSize":3140104,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdN2g2CRA9TVsSAnZWagAAjwUQAKTVatamx9lOjUtOro8n\nnnLQVrdoS+++YGJaaYwgv1YY1wkdajdfmyvstLO0qjYw+p/3X+CsK3gjuFvA\nRIhULNAPnBwPInDLtpTLzL6O/3jCjaJdMA2I8L37le138iyJR1g1Ny6eCle8\nDepGvOtmburFWigo5GaHD1d2srNv1gCkr/Pg/XXjui0f+ko8epISyycM6QSY\nUgOdTeBaipzLELak3JbyFCcEF7iMtP1Lack48oezkHGAu/q1ovlzDYd0HkCO\ny8C0y8GeaF9pPYTpvB3A1XHsfr/f8gSoI7jQHep86ChKb648pVJF0SU/5nsW\nrgpRXDoUReo2d4JdGdvb6GsLfkc1xNN/VwV7F9ayVK2ZVWXUS4xIOKTTQ9te\nIZRviun1Gx8hdcQdgDdSwP0TQnbSTrgaNsh6UXaQ6GHngw7RQigjnSZrKfA0\nvQVkD3WZJXfN19pXSk933ShE5d24CS8RnZpRc/XREdm5yV6ar1heyGu02Xmt\n0/C1SHMEaLM7xhsy9uvj1t7itcAMQ4oAN6k6xb1lGIWJ1OgIHvqcAfP1qJcq\nhzwKLr2C9QdYb5uUiohEZnIlpSOrDx4SE6kjgVq8KGprCEEUzDAMS5HWsbfs\nfAljEILvbuJh1ancAiR5wyciIlCofVPo8RTN1SD7Lx6HswRaC6KyLny0Sv+0\nXW4k\r\n=0ZuM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDFMe6nVAWSVJDsVCcoy1t2ERNeXXmJi0FjkP3zIUli9wIgTtO4mtjrmvDZSoMqqi7UL4iSGDceCkNTvOg6j9EyPWU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190723195958_1563912245447_0.7373286412652074"},"_hasShrinkwrap":false},"0.1.21-master.20190724011553":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190724011553","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3e976a25d126e1d4460a4a2867fa2d4d12ec5a9e","_id":"@atomist/org-visualizer@0.1.21-master.20190724011553","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-aA3HOW1eoSDw5A8Vr77sS5Di2VvyZPg7JTQrw0ClGKvOsf1fBVq7GCReHFx/9laqzmfOfCVcoOmkdxgBvzhVSQ==","shasum":"e8a72e9d2e84ce8b5a60d98b59dd1e7c810d07ce","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190724011553.tgz","fileCount":241,"unpackedSize":3141947,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdN7IZCRA9TVsSAnZWagAAp40P/Ay0HmyXkAS9sFJlMfVq\nVMLJDpki3ggOscOZ5x+3y3USReKzE8gA0Fe0LxXz8dWCJ14mZ9xMCfwXONe3\nnlXcouGlps0kfCstzCZUpIBSOheU6iEXD1uVTMI8dsKb+MhKONf5t5yLqi6H\nhB9WQ226aSI43QbhCjxLaolPpeiunTWUkebyJu9mjt0PIbFkgy8XRLFhxyIs\nLWhT+oIEWliLV6HLp1PvXbuq95jsaoOQJ6vbUY/gYt3DsGhad7QxqZMtBWTC\nzMwZsXDCYwd5lfQgwkt1KTikILHlC0aCybrk5Zs2t9M4VxQSaBSVDfR0aUTw\nw8G0gmDILrY/A58sjaPXMcleb/vUGyRE48w9IH0taSYwvb/+c3wqvqZUyVQB\nkVfYGvBsASg8wiUMelU/OUKIb/+9efVZZV10YFcWA9qS5iCQZnw0jiXkjggi\nBSFkJodGm2ApwbeyQL7Evd/n8qnIFt0AbJQNTe2thoyOSb2QTVIENLvJVijc\nrXb+FRl5jvzi6WhCXD0AMhPdWu9aBhlC0ByIzyWJ8U0AcPxuZZXZun/pTYix\nEWtJeZIJMkHCb4mQR2Tf31z3OCPXG3EvlZIqaR18L+q67vIVa13Xmrn72z+U\ncMtXu4mreCZnjDsJdUeTYuoehfcTIvzvas+XKJb07BDIs5ukK0zRul4N4kB8\nTPGT\r\n=K+ea\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDrCcwz5pU93b0f8H/cxBVbx5THO5BaubCQvvZpRmcoUQIhAPr/9RuaXhjwQFm6RK/HQ2aruHOIe62W/GfEi4XnOALr"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190724011553_1563931160764_0.5819223490093048"},"_hasShrinkwrap":false},"0.1.21-master.20190724054857":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190724054857","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7160c8243c3f2b115bc0829656ed47322ce1b326","_id":"@atomist/org-visualizer@0.1.21-master.20190724054857","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-hAaVTSKAJdTZZVGmZ8RbZlP8kTQ53/UAb/tKo9WkvSuw8W/sGr6aWelduZEvcRTd0zRknTebMjbuWfvTBYx9UQ==","shasum":"48a0e903febc1952f757c28a4eba1f6187f086f7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190724054857.tgz","fileCount":241,"unpackedSize":3143419,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdN/IBCRA9TVsSAnZWagAAfp8P/j16M/RdJMO1Vm3BoC/G\np4IndfpEwmpr67ODkvcwQB2/Mi+oR0ts0grsa3qKT0lL7VpsvfujfOO0eTST\njLaiEvzIhIYiQj736lyC6TSSySkuwLyUH8hwuzIzSRmcfiWY1GqRl4kEuYo7\nIs993KvwMoiXrpJ9D6bRJpQkJuK99xUzqYWcME3Glv0a9GhKdSFwi+YrHDN7\nXPAjf0YDzIvicRwHmACvhXz7U5Pdpz4zY8QezUhZTcP3vHLfNxjzeshqqAE6\nNvPbSExKTHwOntxx+Euxn5XPgPWQ5fKvF2gMepXkNZBp6Z+VAy3s81M6aMUh\n4zgvjjQljjaaanOo+JySqKsaGx3jkR9NxKg1lGqWMkzhOvlfiZHS6fgC9rYb\n/yfbmZos/szIbd89yyyH01DE01WibqhChsol4nu4650bmT1d8mpRGWkEXr7r\nCgp2LylI9QQYnvwG5flNMO3Obct6u5SUCbU5iL7vyVWgfbcgJhkxqQfy5wlD\nKrW31CQtuR2eSOM/VBamzLh/IJpVREXIXHZNlJjr9Ew/wgrYznjncBHgCF0l\nNXSWMDGnnenu7FDczrfLohZ9QWHkpXIVafvcCw5c+ywMNc2y1VU994N06qbR\nx1QJStoLqDCY+uObut1t6EqBz87SM0CAuKNUFRnLsjeGeteU6EHWLB71bWcP\nHWNW\r\n=3rIG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID5lnxWraky0eYLw7GI7+H9idPzlIsBw+kXM1OxP99brAiBDShTuge/nfA/LZhIs+/bA7McJzFvlJ9oL6aKkNNj17A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190724054857_1563947520606_0.6153591084105259"},"_hasShrinkwrap":false},"0.1.21-master.20190724065917":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190724065917","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7fa99cdf2a1b015c08c7a50b3561a0286c3a44f7","_id":"@atomist/org-visualizer@0.1.21-master.20190724065917","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-4Gr7CccdAqzjS1IUjNKlGjigc9yHoqOZWOHhxMonyLj70fiirNaMW3eOrXfQ1OaVlQ+tKfos/tAa9yewmU+5Kg==","shasum":"aa972d473fe63e84054e0a510a8303c91ea97c36","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190724065917.tgz","fileCount":241,"unpackedSize":3145005,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOAKBCRA9TVsSAnZWagAA0poP/Rhc6C9TaFPe6Maz7Skt\nJVv3dXJzU+IXJs4iE+6EkUaJ+HzJVwkTEsDRAxxdvkGVUo+7mThdKU/gd0KZ\nuXFD6VX9Zk6Q24l57qmegT2VqIFN+1Sr+Qr9LVG8b1R+rohuKAimebwUQWrr\n66iBVijfIv5ZarG0GVxLQvYxENqjQz3SfBTXv2EBz6aihwyCmh1BsZVdZ1qP\nsB6uweHqcpP3QaZkekQedFbBvxGTcGl3Got3dS7m3Owu9A8fXxdmOaZZVIwC\nsOkoMzIG4X3GYSJiJk6JAOEVM0Vw5VaFqxI5+VyiK8YrPzxwQKxrdj6+9WpG\nBaYtZb5DikkM4l5YV93KmqdDEYQNbp+QVygEIxL+zE5MuKZhIHQCNYTrlqSd\nhR13t83HJ8p6Qoh7Ht3+/KDFtG8k5pjzh0pUW3CgPGdMejCpLJH3Wy+kupLO\nVoGwy8Ja4DBa3Cw/Icodsn9oMk3u9oNagc1+FoSoRWMjoUiMHftItVs09P8D\naRk9PMRwpjH7nWfeK0JrnB928ajSE+2wnpiJ4MM7P1UQluNLVjox9NbCXCS6\nJuGxmZ4wQDoIY7vUXmH1IPKRW24ZUeD2aT7C/DiE40fK0NRsqTCupgImqLsI\nM3DXbfYxiidR26C8RNfKpS0g/8dDVxhMNteXgqJkd0rnfGquSpZn8yZBgGby\n+5iy\r\n=w/1I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAihJhMdYUsFk7nMRtMV5no/V/OwMhYFzETOrS+yUPCbAiAYCFJmaD1YouC7qTbeZqEcsEGBnsNSb/cGKE8ylTCrbg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190724065917_1563951744185_0.74294231071266"},"_hasShrinkwrap":false},"0.1.21-master.20190724080628":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190724080628","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"df5d0789c057897130db544538918b34293ed881","_id":"@atomist/org-visualizer@0.1.21-master.20190724080628","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-TyLfax78QpFUvPHdcBBEO8Wkdv4oQayKLueD8i+THreQAhziNdb6MQwJ8xoCDD2Wt77E/57+Nv/BL2uj6Q2/bQ==","shasum":"32fe2be166d363a41a00e7838c11d4d5932b55a1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190724080628.tgz","fileCount":241,"unpackedSize":3144700,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOBJYCRA9TVsSAnZWagAAMMwP/0cWttKP2kCUWvOMPOsb\n5R37lLmrrDf+yAP0aZegZfuSJZHnFUEVJozilr2/1tP0yx7Z1IBDCG1g8AsV\nQfgIyEwtFJ57UZsv55PP+N4tt1p7SQaHlzKN6n3rgC4JdQbZPAeCuOM5MYQr\nv01tyOqSMR0mgFRq2LJ18ZQNso0blVabZMbv70hXeeIZKTf5z/slRYoUEtRt\nbaf710Y6DLnWdBM30mKVuD5tiM0GcxDRy/dzlNP8eHPAW5E+lSQaseTxqhNz\nyUP745hgrRdcaiV1z+yOU5+C3809WxRp4r/uOZCBIp5bvD8TjahjGXRAYHoC\nXmDk8O2OhSceXop9RqWuv+nYdTUNOdQ5IH+BwYMj/L13E98QBwhOkA1W1HK7\nFfSin26ZWiqPBK2HJv6fOIgr3fNSKcd9zwv2icK6nU3wL30ZtoKn4bPfTUzy\nUCCAyayv2+RzGrPQXAT8DjgmVTnRbVhUKspK52cvtlKnSPaB4wR//Mp5A0Zx\n4gbzxrYlZhaDJfL1D7AMpgqb744T3PX3tizXxMSCKuHZAnkgTzJLC9ndQ9BP\nk5HJgSWBKOhHTToJz5MDU1GPzvq7eUeKlGETeEktBwO+TiGf7Dn/qKRPlHvP\nMEzNeD2SiuXsDO2cCYYTBpU0SbN32rQu0QQ/qC+p2js4rbp4ZnhohUxUJFd6\nDc22\r\n=Bnak\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA9Q5SAZ3vYr/yvpfdxMNHhC/YyuKLvlveOT9b1IHOMJAiBA7KATZwcSM9qMG6D1Ur1RF9xnXRjbeEpQTX80t5lYxQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190724080628_1563955799513_0.4479304544797156"},"_hasShrinkwrap":false},"0.1.21-master.20190724120402":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190724120402","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c167d604ec4db62a86c8a818574d8aa9e848689c","_id":"@atomist/org-visualizer@0.1.21-master.20190724120402","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-2Dps0v7b48kix5RaErw++uHoTC9WBjpPsgPXXPcal4aaLVXaCWxbUyLZ94M/3tQn0KCdGqBnamNx4BrkH0H64Q==","shasum":"3df65d24df33e52cbd841c917102500e588910ac","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190724120402.tgz","fileCount":241,"unpackedSize":3145959,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOEpUCRA9TVsSAnZWagAA1fYP/AoqnvWGngjqJkrKcuAo\nSiQPYCgo98LchtXMQLU9HOD+Wnj5b47wXD41ZPc3A8Rzp9RmrRxXU6oxbfNp\nGalW9aH2TbQwYLc/Yw0CQ0srUhUFrTxx2FRvTh8iPz94SBZ5omPnMd/v6aU3\ntYITODVCHvAHBsMlstD2sK812g48+nhbHpNDb1D/lpCFJbj9GD5bWSrGdg3/\nzqXBPfomXc1qAhAGFVMX3JC+y2yyRM+NL0ZrjadqqOnICNx9FIDSVvFz2qhp\nDWKEK1Yu4JlIHxpGJueO1sATxig6mwFD/oiZeyB4HXUVuwbyKPEWrCbU4BL6\n9IkizXYvLGWsjUbKYUmmL3YyE+2kOWGTxz13cxBJr/7lm4MVxEw4GzK4/XAr\nGRpJowG8oluOwXLxNqAm5IK2iVyX4daV92+0SDg66nVuS/0CY/8upgha3WGJ\nyw+ll53KzTPoeTHx27Yac2j65XDeQ+uw3Ew7eWh0Ztt0jEIA98XkW5qmzo09\nEqI3CDmgCnLI/gID+bsos2Wio7J/pv+h/b5E0yyNzfrledu90ZE3bLe4Uy0+\ny08GOgxhz1isNmUUMHN2lLlThcB/hSqJQeZPOau0KahSfKWIADrfIBNBZpAS\nv0H4vMR0MmYr7VGQOrONlm0fV9j4BPzmEFftG8VuFxAI3KBLfXMTzUWfDWZH\nG0mZ\r\n=QB24\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC8SPO8qM15XVukt/4tWL6mwtsxe9iyRcXWY/jCdHHD6gIhAP4Dj0wz8QiMsVpxKEC9zvJwkUpsSztyxCwfw9wV8TVL"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190724120402_1563970131202_0.23675735273595633"},"_hasShrinkwrap":false},"0.1.21-master.20190724121609":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190724121609","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4e89e74bad64462c80f7a8be6fcf7fe52dca292b","_id":"@atomist/org-visualizer@0.1.21-master.20190724121609","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-NffdwXTlvZu7FaIjlnbQDbIJpCeXnzG41rHActD3gDkldrzspN6jh3vPl0esp+rmX4z+mERAFkpeVrs0n4SoCA==","shasum":"4ac7fe93056ae79a4cb766229a79f164ef25f8f2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190724121609.tgz","fileCount":241,"unpackedSize":3145959,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOE0LCRA9TVsSAnZWagAA8HEQAINEIuTmM+N2SYgpVSxF\nvm+mZmjE15TL8G9iF59WB2ziRaDgMpOfn6MzYD3ngdzkUlH+bTcjXVbDpS7C\n5+5LIYkGk2qt0ZKnIP+0afUnHiFSF2hxUGcCBvgFJYVAjWNqYpRz89fM6J/o\new2I5K7WNH45vYybreTfpvYiReEYFugypXevihAsxLJRCpvo/FAMib3PeSHH\nF1rJYE25agyzluPs5fB4XVfBtoQzYdCR5xHPPuI/X+UozyBd1XCC2xVut2bk\nW5mQ2b1oVfen23+3mtC4e7GoNklt+E6zRSSMNyvPEqQFJ5Hf7GZsfjIYxgvG\nLHnsnYo8RvOefoNC7vfvvxjTh8p56rjgqjLmHlfT5OOrplHg/ssqs2BorEam\nD1JTmYbNQIQkE89ggyj7X4V4wgbmzPgAUeKfDb2uaoRPYExLwwfu0wxurCRZ\nnEpcs+d0j082SlZFOAjNEkL8Y9R75lvUbehmoLu9487b36c6BslDk0/NJ8/R\nOasTlzjiIPTxCULmuVYFx9R+6htfQV+Sn/EtScozsZ01ZADXFBNEHvdnGVXs\nZe4sJ9zrT+C+fdGMgvjL+z+7po2Sz4OOfgi0OY2hPzU/pxyseGL8TK+2K3TE\nXuQIbPoC3nllpUzDDyjZjI+uzRgN3FMFXrS6kYvrvlfAzZyoY5jv791UA7FM\nFdqb\r\n=BcBb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD97/CAWzA1B3bE6ZdReVW5WfMhSK9EuWD3pZfdMkpHRAIhAPjHTXsC7QQWFaXat1Qg9gi7tenBTAIwYN1fZUeRk/EC"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190724121609_1563970827029_0.6077575432707989"},"_hasShrinkwrap":false},"0.1.21-master.20190724121729":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190724121729","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4e89e74bad64462c80f7a8be6fcf7fe52dca292b","_id":"@atomist/org-visualizer@0.1.21-master.20190724121729","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-vIXSDgl0T1D00pEqKgbCKGApvFD7l0EVoO67UTj4K7aHhlTNh9b7cWP2qjRhH/qztuxuzR3/ZFijphsjRwhhCw==","shasum":"834774d4c44eca53ed022a2d9db0556788e26fe9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190724121729.tgz","fileCount":241,"unpackedSize":3145959,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOE0sCRA9TVsSAnZWagAArtAQAIWP7L/r1zZ6czUULxOI\nbhq5n2M3I1bzLeP85ac3BSZMWOMIKyJnJXVzv0XrnJPueB9T759F3VJ35ItQ\nFGwHLFWnFirkAIfHeQnbFMHAjVnuoryOhtuIJoZh/hmiTzvyIwwb7vNiAZPP\nMLjWCsht2LcGjlhNYwIG4sm5SgE7TSjO81+mxoF3IxRYu7G0rxVEI6yk55wh\nXwodVOw69Qb2o7wWmNz3Jn2qxD/496MzpvCmJCEcBoUQTLVatrQMXZBexxGV\njJ25qTzYm+S6YDPfOF4FtnPZWlE34O/Tj+Uol6tsaqTlSzwU3nnNmAzG73nm\nByKdovz5MIJP7vsU0EuekCcuA1xRaQ9mF6phS/JZnF6CuD0VGcDbw2dJ/kKY\nIaqdRR1Sz5l2Fm1EQPA7r2ljW1jJbu1pt603owi53sPeXAM58QGy+ODrGUA2\ncWLeo8p2ciyGrmSPoBXsH6ejY6bLjOCOR6vPiyPtVdt561cmrFZhm9Vw3bIj\nDfsRW27fVA7FPf9XTAeAeKpHqzYa2yQXo9mP25n7c6oZKBB4H5HKAhRKKZEA\nj2oP5plwr2f0YHdYjxiYYyS3sL8SfHzm7MwM+SIDePsKmJ+i/pvzp0HtXoKT\nIny1f7RhCjbNQ+5K7ftrmpiRfq+1PJoELmYZeLvbxZPzPCC+AQhxvAe6L/YK\npvb7\r\n=r/Rc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvuJ4Qo/NsTW8TIfLCuYvsJQShC/23l4TzaYdGV6OdaQIhALkCo+iK5WcxmZ0y7syWe7wfYHgu3ndkD3Px5CMJoVZa"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190724121729_1563970859480_0.6048154218208066"},"_hasShrinkwrap":false},"0.1.21-master.20190724181240":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190724181240","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cde8f21d3e1e58c4b3bdc45ddc6af4f20f757e4b","_id":"@atomist/org-visualizer@0.1.21-master.20190724181240","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-LO4rDG2wkI27XeqTdRW48I/L400af8gbUw9Z7JKnTXCERd/XUL7rVr9CjoW2xanzMJWtVipX+cTRiwxziut/Dg==","shasum":"46dced58d815025da6c217de0c788d0d6ed034c2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190724181240.tgz","fileCount":241,"unpackedSize":3145932,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOKA1CRA9TVsSAnZWagAAfOIP/iigSNMap0U1fU+e3f0D\nyCr0IpgOLWiMbzpU3zlQ/9OeL1Hh+SsVTBP5NCmpu++SfYUvQk8UfGJqk+yl\ns2g/rc+PnlIKOXOdOyjRLrcbo2s6TJ491dkWdqdZxZRb2Q2h+fn8O2j3VYtG\nHrJpsZVwiSm+2N+yYXPl3jUcOLDkVkRlw8NpObfA/l6siaCbXLO/kogd1kS8\nyLqT8cvOw/X0XUncE7OiUwpherkGe8SVR5r1ZCagSXW+UCnDp2aDE9Psi8c5\ndAk7x6ULoqZ8GfDQMcvaB8qpJamNXurDtdxuIJ9DuBpsWwmnmZxdttN2qp4C\n832SbZU+bSpuUkwjB8bU7PEzHy+MGOZdrhdlgsAF3DdM8AjyvfvZmXpQeU6k\nE/w6JCJYuuj7a3Pf98HkWRaRuiJeQZjgFXCE86na/PbrLlvUQtHb1qtW97D3\n3qih1lu/ARuKkHNCfYpv4/KoVqaX2r5f0Zt74VTfPwkpZDFyCkisyX3sgqWT\nHMloBnZcuIYdy9S5GXOn+Sa2dMyyDXnQoe4lFRufBI+sXSsRSsPyZpIzf1Bb\nNCqgJNRd3Hha+4rwOQzToYMJsMdffmLApntNLVC6w6ZSVQe+W5X3o+6XIrbm\n5lzHLkzsfZWZEUXXXNje2k+IlkeWlI5RhHoATyL0O+JJE2AxWmb1t9AEyBe8\n4k2g\r\n=MWdS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD5B8T4iob3yyOqaNdDyezZstfdMk922hTuc15AOyLCIQIgZPv1v95LchSyAui05ckmePDGy3BDzlj+EUXg/rlP36U="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190724181240_1563992116421_0.430114582342334"},"_hasShrinkwrap":false},"0.1.21-master.20190725002401":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190725002401","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0c77fbe7d605f475bf50efa4550a9f8cfe4c3874","_id":"@atomist/org-visualizer@0.1.21-master.20190725002401","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-RMMsLPw+PCzC8peTBVvzlS1A+CbGLFZGL7FuTDpOoO2U94Rzeq9eA0lUaXpV/kw6/Fj12gy7cVVTxDAw2jv53g==","shasum":"5cb663194ac9023f51de056e90bfd03f042421f4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190725002401.tgz","fileCount":235,"unpackedSize":3128396,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOPeICRA9TVsSAnZWagAAtagP/i00y6wabaKA852ogFD/\njVi7R38+Xrq72t8MTx6/R3ypP0MH+lmY11a+EgBU/fvEbYdnsuh2UswRzsuR\nCOypAaUG82OECNSwSQLtlNZ4ZzzOtUf2n2k5kLiIsMxithrrIWElq6nQLi1O\n/YvLQpOnn5CKisJleD9JkFL6jPlwUmNZ0SZLHl0ooW1H32IAweRNKS+GiF6t\nzJd02xTHGIPlzIwYSzMj65goLSalHNF/uhFbRsY8CVs9lfo1qnzGiLhgnGwh\nv5zryrr4pfVa7A7+PCMlxvkddVXQ6GxrDWloV0qiq/1Vp5VkkybgMNkED4E2\nKm/f1+3O4JlmdSxOtWVagzSGIwdQbw58M/g4MHVIyccPx3l0kIQAG/ltTlQR\nMzfVg8iIXfq91ZadNBDqe28SxB9ekpFWdnPUm2wEIo2XyYw9edy9wSnatyEG\nKXGrNhOH3VGGSrg0gQMCcFteYGJua9XhU2mTN/cfRgqCtyHV9WAG0Ax7QHoc\nGesDpN/lspV+pLNQQNDO6n59lZSYoRm4WwkhKqq0uTMDSm1cFvY3QaK4BmoS\n+OA2SKudxkypZ/fIEVymSvpbrpvqnnWFDTzATucL8uQYyelsNGDjHWMgDFPv\neKEWyIHqrxYxc0NHAggj6oSKesods38SqU0p2p0reqglQ5PdPxHfW/Za57ND\n7wo0\r\n=SllC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDIq54cT8vFBUGq3p1G+eGLv3hk0FXzqMxu3v22NnTQkgIhAK6JWvg8W0FAGC0Q0oV6fNXPL7vA4h1b4gHPPH7aY0t6"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190725002401_1564014471713_0.671700274490713"},"_hasShrinkwrap":false},"0.1.21-master.20190725031421":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190725031421","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d26403a2392a043e54ce39b70b62dd132eb09735","_id":"@atomist/org-visualizer@0.1.21-master.20190725031421","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-1/blJ1xp4FzoU189FAsVyIidsC0jKtEu5q/cxh/Dnb9bFplTL/ivMcO2rX221HABhuZyzpnktyB+OXNjsQ+lZg==","shasum":"55f4d5d6a106624ad35cefc6077b26a619188357","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190725031421.tgz","fileCount":236,"unpackedSize":3131928,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOR9LCRA9TVsSAnZWagAAphMP/ReSAlEWAvSZnFopP3eV\nSMh4mhauqtbMpbW69qTvY/d8UVVBt15SkCteKCeh7Hds3tHo6k62ip4wN551\nmUkOuAQVc9Si6AwMxafI3tjvQXX9zoZJkuzJFdhRIVe995ZrsLd3+8r2fG5p\nBOAQblmJDoCSTTH0ARHSESpzImLhwGb0DKOMtT1zyhMGRvtUyQ6Jv9U8ODlw\nRQeyXdknkz41VMh/AEigVqKPdMCOXuSot8mcqts8905vM+SAZ4ixDq65jZ3z\neELEsWcE1/BMBfH1kSCpYSuGPwE1CkCJsUHID+CtOYQlN33TDB2SxJnSnh2x\nUngmhQeXO+0OHVIC7E/0YHLWlevDqFxA9F5U5q/Prk6uMTcgrde1KseWf3fn\nPhszBQgwOOrEkLWvlDzpRzuoQrk2Pc+3utYc24NBZ+eNVLi8oju3oVc36UEv\neou8dGEbsRjf1SNykU08E81SZ1GHMLRzgoIh21AZvTvJ8hoW6sISErBlmX+g\ngZlRukUusYHGffe8vir7kZ7gtJaXtN0Fecp49kkysugFLmVxH8CVULz9Nh/7\nRuSzgB5Stp2dOcqBLHkLlOhiqCy2wYYNxlReveTt9nhjobaalMPsOSdnXcfY\nYLIexvUfTqNSGGm93lnFx6ExsJnxYAE8uAwTDdqJ1Xvl9g4M3zmJtR7VN6hv\n1Tbu\r\n=yAI2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDfCHX5wO1vEwmsONiHs7L1ZJWlwdAXFDFchllztereNgIhAJ8gf6jXjAb8xLhijBfSupRj8OlhncjeWaa3jWiKED5J"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190725031421_1564024649646_0.4105996589237231"},"_hasShrinkwrap":false},"0.1.21-master.20190725044358":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190725044358","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9256946db8b2407be27430aea0a80003cad4a64b","_id":"@atomist/org-visualizer@0.1.21-master.20190725044358","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-jqMWnKhSwxf7DJLOZrCHZYY0wWPjiWqwLQ4RkhLx7tpaTdw3orM6+LeDH1nthvj0ijcz0cpb1HYyOHkGIkqgsg==","shasum":"793d5d44d93cc433f1f0de043154bb02d0ca450c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190725044358.tgz","fileCount":237,"unpackedSize":4423598,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOTSdCRA9TVsSAnZWagAA/GEQAJlJgbu40CNiyzV2wEdm\nn3HkLYZwqZOm5QIfJ34K4dOoMApsqZdbDjWeSxruFKfcCTr8ivr89jPonIHI\nmvCDiosyGlA2avqz1jj6NzfXAJBMtJ2wXRltHGerkIg/1epmGgTcV4SALkSl\n0Pn7b2Z2X6PODLjHMKhottWXhNFa+n2fENYJcJnxNXbjkN5As8t6zoLhUXNs\nYS6xguZEJfBTYh1uPvAwfmSRF8p027MvllYmLcdJO0E2xHI849aMsWorpb3a\ncqbdjaHGADoQaBHjb7yNRGcrgYYasrZ6H7Ee7ggzpLc9kBC0rk8IBOOXGLUV\ndyo5evNESy07Zl1TT4YE8h0hOtDQSKJIXJGpgnD8+wfiHLeoqpzxMLTrT75F\nqnOqiM4GnqXQURvXjuLFmjg3YKyjlNzAQsNOnciOjNMIXcT8ns9/y9YHyZzz\nTH+Ey20Gc3M9C0yg3emyZzKZ4cAOJPYULmle00iCGIZJ0Y8F1hcLx0GgyiGr\nQ3DYgc3cPdNv+Gea2Qb1+lFP984blZQm1VtRCQVzZud8CovGTl4PIcPrN0Bd\n1ebnDIo1wLZsr2WYILKGxmXfpKrPsyPe+OSX3qNsUZm7ATsQoxc/Wb/Kr4vz\n74P/v9TmCMsM/EHNYpiiRoN2Lm3TNLpapTsi5NZk97ZLFBupy0WuFLIaZDiJ\nuQJU\r\n=K4kw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGkOQQlqnOCBRF79Sv4mzD+rbqyVNbeQmXgQq828xy42AiEAgaIry4U65S5Wia9e3mOCCKxdAxqoscvecSAiFzeM1oQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190725044358_1564030108752_0.7123637720012657"},"_hasShrinkwrap":false},"0.1.21-master.20190725075334":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190725075334","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2177387604486e95c68b06703ce2e320c4006660","_id":"@atomist/org-visualizer@0.1.21-master.20190725075334","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-k+t9mfW7uNhU1yHuoMYBEwxt4hK41yOZTAhZ4Etk7Rdovib+r4sH+ZEwTVAglup8jcAk4CbLljZ7d8NNTBpOgw==","shasum":"194c533011fc67a473973f67cf61b58a6d5df9fa","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190725075334.tgz","fileCount":237,"unpackedSize":4418202,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOWDaCRA9TVsSAnZWagAA0coQAIMTrMlps0p8csfsaDMz\nd/F6cKiSN6tYVq6exvJPRoD+6bxg5Dc4/wEFeXUB6w/2BBiOrq+471ay/msM\nmULEZi0gBLf7pEQuRZF8CXrCcfgXL52Rx5JQWD/T0qO+vZ+8dPpnKsYMluKu\nCQUW+4FJ+i9sDJVB5SsMPX6Bz1W2Us3NAKJYtJQk5YfGgg9YagOMqwaK73dp\nvaH1WobIk3rTTDTItWiUOUmt9XPu8v7Itz9ngeqKRgXzBWZzcnAfqjzLMfAd\n3sb8wbsQB3w+PNw4K/26cjnfjAD+2vYBzrNfYwwNqLl+iWcKOukn4dpYOwM0\nF3FcwYvWud2VrdqItMcHkKLUYo27PJGUMY1zDvOZsRDVrV3Nxtt6qSdYF3x3\nWVYcXYkV6BogK4Iyd5ZrrycRtqlonQkZPfsIrSYccWD+8oEs3/f3Xdybn0eK\nzQhcW4BnCiTA3j8ce7Gl6jnQ+RkzdlAE3zWa1QpjlddjC7P5Q3bmkwnTONcb\nIMnhJTep4dz0UaXWYliIUf07kf4PXMmdRuau2apWps4kWcOmzdE6mUXdKIVy\nHM1e9jnH4MjsTxqQl/Jkv9zWix6trin5HS69bh2zFPZXtV5YNzG1asqr3WDj\njsLdSPuQsDO6XxM7CeIqr1Hh5ijH6hQjvRkTS7icVSIN1XLPLThFJpJRz8mc\nkxfI\r\n=WfYy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBfoyAKlDQSKfVrZlfsdNs1AHspq0yeZOPl7Ii5giGb/AiA5MDnoXA3Z4OCbxful0QzROEjKQvVF8BGC3zJmKjdASw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190725075334_1564041433537_0.9768120973060495"},"_hasShrinkwrap":false},"0.1.21-master.20190725205420":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190725205420","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6396a41da54d5ab225d70483746ba77b18a65315","_id":"@atomist/org-visualizer@0.1.21-master.20190725205420","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ipA37SkG6k7avvbYO+PhhzKRIbLBzLCeM02E7U5xU4YHBTi/8irH3nsSrCpx0KqoZnqT6yH+Qyd6Z8a/bGej7Q==","shasum":"57f838f60c7246b507a88aec8578e090814e4505","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190725205420.tgz","fileCount":235,"unpackedSize":4086961,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOheuCRA9TVsSAnZWagAAPNoP/if+f6dx0xS+4QDfMqIt\ncmmLItgv5H9peXKEpBTCU22oPAP2Yk7vMMUhzM3dLd1ITEw6RDPNMe9Mf9fX\nzol13sK2hxRRBrpUAkzWReSFF+Bj0Gzw+4dZaf2TRhSwFXc/NK2MQjw2AIGS\n6M7PLCtTM/xd86ipSlfB6AAUlgTmTPsHDbZhZjuz3M/sLHXJVQkhHKsVCijK\nEknM/CZe9Us4j5fQVUok1gMtsx6zfXUF1Ya/wTyKlYtAY52cPN4q/ZU1AS5k\ncj6FERhTLcraUr5Wm3j1+3lrHPVXvWOQDIYWXCTLA0w1GNW3YO2h1IAa0pTw\nEJ5myH/o/DbvEuybzF/IfJV8hzPPluxJUnXX7SmH7Ews9BTRYkk3ulzhs/+w\nFtR1BsJendj2ekL0XIXPRDMD9cL3yH/Y8UPsLhXIFePdfXX+REmV6WBB4bMt\nPfmyLW7ircpwwbBQp5gg23YsQUFZzd0rtpTwkFr8i+OkP9c0LaJ/EDc1/vHj\nWz3B2/GDJdqrYoAeoU/yiMoWU/NvNCqOFxJKJT8n0Wgsj6NSIagdOyGAVHQm\nSXigmXLILG6UMij98eOEBvKU2sqRGLHBhLN0bBlkvUKMtKVGsa0WwjD3S9kd\n6lZGjHIYl17+hJy1D9bs+7LOLx+9t77TXwp5fPW01+YaoCOW89+oYaxVK5aQ\nv9bE\r\n=DfnQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAqhTIYMUR2cGPqU6uD0vvfnnwObJP39oezmmEzuzdt9AiA/giNMxutPPEajWt9VUk75+GKMZFq7/+sXvcckFa+5Jw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190725205420_1564088237666_0.4622678148459982"},"_hasShrinkwrap":false},"0.1.21-master.20190725211152":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190725211152","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a6e4b30d9d4cb307b5918d150a1ea9d97317df3b","_id":"@atomist/org-visualizer@0.1.21-master.20190725211152","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Vnkg59A3Jjwhs+Fd086Lb0tj2mqa+z0GMA/ITC2mffI2votmESVfhi9S0byyWfKMLyGjpO+Jwx+GaIA99ATKjA==","shasum":"4bc628417430fb3597b19c45aa01143243ad7599","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190725211152.tgz","fileCount":235,"unpackedSize":4087881,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOhv3CRA9TVsSAnZWagAARmAP/2sirJoCm2UKjME8Xiwf\nO6j5nrUYK1yprGCiSpT/rm4b+IjxvpB2hndXNVPjv7iYSmV5yMeQQWcbxJCN\nNXh1Qe4ka24yBStYGSfLCc8ZrC1qgpYcC2pWoj8on+OWo01H0e96nZ+6V7BC\nT2V/SmyYjRhyXNFAM1QOFMSFJ7HLj9GRYb/9+llUB9Isceql2XugTI/6kuli\nQQoSq4LdQAnYWAX6n3CG6dghW6xtybYe6QHl9oVVIgBYLzxgx4BR+aWotg2P\nRXfPSBCS6AFHyA8y9PInbrXsOfBJKaIQqPqnwDnHfvJaDoT74bWsK4zcY8JM\nZvRD5peC2ml6QONzE0+TSOxn3uTOEEnsxVsaJEKobqYjxPBogx3LsWA3Pwsg\nRhEvM2lpLh/tuivQfTXJd/tC3n0GE5u5kQxYSlWebuM8iJrhZjYRpKXDq+VR\nMYcxJDpplxlNLoNgS0JpzUGfCNfhSNydf4M7vLEVPbpanIOepVTecvwexRbu\nlsULqQ/AwAH876QVyS9HvWzsrBa2awofrdxZHs1+tT6kaSwD657/fOw8jqsT\nlLX63aHWDDkmxrgdEbJrsEMqpMC9YXqFfaz3oaIG87JMFHzeByff8bqTiH2o\nOfsm5mhzUU2My51vI5HADj975LPI8OseE3uIPtI1btCsHD4zzpQscLxB6aCq\nul79\r\n=Fz2O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDqMEpV2pCO0O4N47phuyF3SWylDeh4Hgb2GPmaHBX1wIgTd8hogp5GPxZXDRLQZlHqn+T5THM0ZOoCsYmBfe+OyE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190725211152_1564089334662_0.5959128755948195"},"_hasShrinkwrap":false},"0.1.21-hover.20190725233131":{"name":"@atomist/org-visualizer","version":"0.1.21-hover.20190725233131","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"565544716e6c4b370f2110ff628bd09b6cbe0e3e","_id":"@atomist/org-visualizer@0.1.21-hover.20190725233131","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-9zDGmc980TAbf3fDEB3tMll8T/9Rvp2zH1xCZI8WiabVBCCrtMQ2cAK/6SgvpTXxssOVwcVLJI48bERLXc4A/A==","shasum":"78a4cb9519349cf6188a1cf2cfae9ec948b04c09","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-hover.20190725233131.tgz","fileCount":235,"unpackedSize":4091282,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOjyzCRA9TVsSAnZWagAA3E4P/13eyOSwweNjaNY+tBG9\nFxuGvA0aEm5CvTjEUC+tZjGvMvxHUsIAe1SsvmIv5s6B5C5LFGVl2G1849oG\nQ0Dq4Vo4V3740M35MAo2XhePxLJbrUlLL6t1IHrYNc6hQGqwU6QMqDu6AQbf\nffzfKtXscPNv9DXLE5X9ta0tMqEmQ7JkQmpivHxNrWNFPTZdF8J4EoM17I8n\noTW5DYBLwijuFEbgq9uBmfVh/Lm8UBE0robFlfXDtu/crpma5cGSD4arCdcG\nCiXThnqiB1vcA3jr7ILGl4ONpOK1CyAB4/qrHLGOmknrwTjtMHDdmsa7GkoF\nMPupiU5LNpNaRLfVI59wN83r/nsiMnl/Di9fLWxkBlNxZOBWmJ0gsmtru+GG\noUOnNA4kvx7O+MmhkVi7C9A3nF58OYBDGc8r+RgGo19HR0UfuUmxyql1vejK\n7nCuktNOCAcPZ1E3qgnchn8G9YlJDUFJqjNcoreEBlX1vdFHy9f3ZKp7RtNb\ntz9W6k8HnKAm7ThR5MjXUWZkYrSzBWd3g+qh2b3x/Fs/JBV12tv/hVe7qzC7\n+8KWHxkvcAbhFlRLFqS5dWxu8/RwFh6ZRlUT6RfzuYpAeO2iNYq4+p4/ws8a\n1A19Bq5rXZpu5xCKfQsQvS/+cYC2BZX1+ySZtLvHdaYOjBDlpl4cbegaLKCl\nM55g\r\n=joK4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG6bpx1KDGaL++AP62PvPmmb7HMZ3OaBjp4IF/J+WCCYAiAeGyOd6UA2XdrcdSlRnyeimzlsgFPCXUOqzVuNomiGGw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-hover.20190725233131_1564097714690_0.38946362971517146"},"_hasShrinkwrap":false},"0.1.21-master.20190726020848":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190726020848","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ef4128b188e6de02cefbcd6e1f5e9e13902e9157","_id":"@atomist/org-visualizer@0.1.21-master.20190726020848","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-GqMmR1aXk76FC9213W77tH1amS12DWSCtCvUAOswnrP3pXFfIgvg1x386W5YR4aHZkgUlsDfEnVNRJ3jFCO5RA==","shasum":"f78b15c19defde1091174ddac401c8cad3f5c276","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190726020848.tgz","fileCount":235,"unpackedSize":4087116,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOmGiCRA9TVsSAnZWagAAAesQAI2P3HN2S2odaXvzLUWu\nxD+6eh5jfIYsrF5/ZliogbB79rNe8QVWWnH+CO1BxPKva9fxmVqgvn4tD2kZ\nZG1HxQv2Q6BlaDnaoApCBD2iAAtEmMUG5G/Tyf1jYhUkVFVBIVvPC2UpvAlu\nr3r13BmIr+3S4pTGfW25xc2rFuoZXgy50QVaWAcWdfjHDoMCj8gpjFtzQbmk\n/uomHJx2ZJQgXWl3aVMOT4H1dYq5y6xjVOUx3mnemjC353rUd+e5UG03S/Uu\nepULdnKCKo6CQRai2S1yBzmPEiGeEwSORvxGpbxJwr3s9MA5vbUbDwzOyqEk\nK6dVwF91AX8HxnWe3OaJQJV8GT/rCgZ9AHrmH9Jj0WtK+8J5BeFn45Xo329G\nHSoeq6FGhhbdh0FSuA4/g5i/wfX/uhodv/qiSvmD4yhF3JwRg1+HLhEnzwPn\nMtyPKlFBIcdetCSu9oP2E1jMv9XR4cvPPq3HObgdj9oZC6L6/uXVnRbNPQli\naS+r5XTwQyhjaPHzFUoNtbrwgSXmaQdgBSXG2TJSmHEv9MdjeARxp2RK0ct+\nbLzizfDe4/NAxyhw6zwo6MHvGb8D1feDJ0H1eeYrLpzJWxS1jKEACTFljuon\nvmN6R12YQiUqwmSoWygpJp+2aMjc4/v9KRjUi9DokyUwijXmC40El81360DJ\nkNJS\r\n=PFMD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnhYTCbA9xRTBp/+J2iBgymneKn3FBCEwqYk2+Y0GcfgIgcVbGxbZDuW0t7QMws9rTbULGJtsPXyEe7FL+CuOyDGY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190726020848_1564107169601_0.5774081460530673"},"_hasShrinkwrap":false},"0.1.21-master.20190726021806":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190726021806","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e926fdce98c7d0a94cd3844444f9f0ff6e89c27c","_id":"@atomist/org-visualizer@0.1.21-master.20190726021806","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ypcvdKuY4DU6ukYFIQvNJ+31wg4bFIguFjCwjFSR/YETkVMjTVeXD+zsEvaedDNdYRGDPHSqd1yxcB4HyGisLw==","shasum":"904c8f8b962131166bdb57610685fb8eb285c6e6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190726021806.tgz","fileCount":235,"unpackedSize":4088732,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOmR9CRA9TVsSAnZWagAA2w0P/1Lok/tt2AffR9uqElhY\nZn6eRmLMPuFiWXhpsqB39wzoRRN0NeCXM8yD+JozDuJpQYDtENUlVA4xTIWS\nCrnqnF0uI4IT5T7qrb0zhDP/WI3gqV2/1ft7E6NExnXkNZYqJUBlhht0S5AO\nmsxDtCasNvKjynoIBbDPFQN56oIPjMEfJ6ccot098RerAYhCYZUBmbey9qwI\nDACTuM51d2q0Vpoj4qN9Y++bpSHscwT33boJSiLeqjtYm1ju72V7lpXRGvdg\nEMEpcubPzQV1whO+zKx+M88AhgQl4W+/XnnVaC99GVWUnPn5PMRaRX9oxMTZ\nLWU1NqmH2wSYDJc7khXFTmjlb0mD5ji78GJx8ralFiiDAPatPBKtBDdJQJO3\nZaZbqb7uiAmrh5CTJEmmGL89DCf2YnvWDOTzE9w+hnITMqThqi+GOWE3S7ZJ\noD0HFUT3gmbkTT0PL90ZYRwoGc2+c99iWlXRs3iCb+2KPNFlDDsEO4mi1Y2t\nBKdwLPBEeuy8tCaWFvE2+68MPFXwtfU7REj5z5ud3n92xmF4xupyViQcn12N\nbmhIdYtfCZc2HQhhJc0AzA3KVDGRHQ0Bf09a8Wt4lfLqPHwyHHiwzj1NBt7d\nV2BMiF+k2ekq2QT3DwIIS/JPu/EQQA3FVK+8SY/1ipzqujtIwYUUKTJ9Fn3b\ndE/W\r\n=Ix1V\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCezS4jMiN5r8V95oNaK/Rt2NVCw+/+1zWMQFu3oGZFtwIhAJGATzBFr/HZgdtIH7D97PQXTO98IyXgHWhbERu3/pS7"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190726021806_1564107901236_0.22257604803343978"},"_hasShrinkwrap":false},"0.1.21-hover.20190726040130":{"name":"@atomist/org-visualizer","version":"0.1.21-hover.20190726040130","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7ca53acfd294148956bcb5070b9b799b1e7693a6","_id":"@atomist/org-visualizer@0.1.21-hover.20190726040130","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-cDLZB6RMvgPYAPsQK2IoYHkQpiSU0G03TUjses6AuO3EJN5ixtInzyKkVWuxHhZgR8BMt4GUiBOaYtvwLPzFOA==","shasum":"090d93ce7d0882d8b8e11642eacfb5f16f4561e6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-hover.20190726040130.tgz","fileCount":235,"unpackedSize":4095652,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOnvSCRA9TVsSAnZWagAAoicP/RTprIgeD95HQIMFw9zL\nwuBxlhC+SAjWZsbCM4hnqYjMaEAEBqqzx/rJGNJWb641nPYI+cdxVaa0Smnk\nHkBBSmDbj2/0n+z9In0yNw1CdGMSjVnLOHFkE5DNmOPwY9kmczTFwktvXWoG\nRQPM91Pg5naCzNPJzRnK6Q5R0dKYPjpkYaMh4FFjInN3eV1PVr28YuWTA16f\nd7RYQ7Wq9+uwAUfcdWDAafjK3D6kP+cp7GgsHeia8KLPq8nJ64Y4ZNAdJ5Ts\nv4zp+fEeG6OTuL/jGs3IH8rh6dOhAJr5FeFoq9+BYaIDSsE58oz0/+HtzVkG\nCEcoW6ZYpKoIOVyMpoPcMnSE8B0MCZA3/AOI1R6ixoY98pLQmf1fnVERX3S+\n/22VRqo0Jw5rjySY/KKa2p3S5BZ45HqZkO2B7HzJso6PDVDnrLcXqYXifp/u\nfeJLaZj1L8hv0/2PEsIbcoMCZu5RbV7eKI8VJ7MaQ6uKAf7WGaE0d3B2T2+H\niw7Icz52zY5Ck4N5Vir+0Le3z7FtCPBl26ofA0Wtzep3PUz9rGcT8VJhUev7\n7DdZ6FJQuPrXdNiOwj4iJ7jKZOQDwvX9Ek0nr+eOzfH4vWRd9KOOEd9HuMsJ\nJBkY3RqkqTrNZyLh/WVlHf+qXosKCBx3TmmhLNSJKLEYv7XVI+9x8236U3Pj\nlgIA\r\n=Kypy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICSP5xk1BeuU0nq7tloGzD3rYBtLQvE5Xoko0DHUaM0NAiAgC2v+mQm8Uh94G/xMUKZAw8hZoESeyIs66Sj2O6jT/w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-hover.20190726040130_1564113873520_0.13959354245735844"},"_hasShrinkwrap":false},"0.1.21-hover.20190726040721":{"name":"@atomist/org-visualizer","version":"0.1.21-hover.20190726040721","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ada3acb36dafcd6f4d1453f2e3d5f944fe56eb15","_id":"@atomist/org-visualizer@0.1.21-hover.20190726040721","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Tb8em6EJjZE5HgTTtKvAmB8njUilTGhS5foAGv7LMhDq3dO74e6mDrbWGcjJiIsygfHn6rr78Q5R9pTkRpWS/A==","shasum":"2e5667d72fa8673ca82967d7d26db226c402f6c9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-hover.20190726040721.tgz","fileCount":235,"unpackedSize":4096503,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOn2LCRA9TVsSAnZWagAAVWsP/1X1xkC63kmEmZtkoeA4\ndirs1oZEYtpmnFgME+miCN3RJnQsKXnvvOcPE0IWct+LgVbWlPcZRYrR815G\n968TA95jJ45BJaBRKiiXWOKHgDrFpuBE7HNajFte2KBZ5g9qiTQijQU68LoM\nd5wFW1+/eFjjvtlUC//6lMWeoRv9vfg22/u8F+DqDASTUPNeQ6yMfcFrszlv\nPK491zv7c518ogSImDTPv5ZdyEGUtOvudfcNfH4WaVnDlhRtkDOymGljUs9d\nvfnEWm5KmB0vLsV13y9Y3Ipj4abeTAJdXT3y+hPyuD4974ykxipS/GzYi1yd\nR2IcCKR/b4PdVaYpc0863blE52G+cVmUPy5yOSF7SRLTYWZNfJc96OgIA4YG\nz1zNVWrXYSYY2TAMLStMZ1g4MFqKEMmU2lEf3V0tByRiblLMWHCjXQaf+5sz\nekTk+T0REZuA9yXMsAFwsYUcB3ADN1fFmAPebaCPNthDtvjgOIGdpHVJG0eA\nPwbJ7AzEm7ZtltuBsi4wpy9yfOf9SrPL9utKJVEgUhxWqWMTlzo/wDYBkL80\n2R1s+lmJCyJuEKFvFVVOVdyBIfJhSko0ChdELvQ0XjrWElO74w8354JBD4XK\nuZYcd7Gy6MdKx8ARIygi8DrKql7n9ezzs68orEmXuCQwdesY+/xVC9RPEftq\navn4\r\n=/7qU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDC4k0qG5C6YFr3BcYM4fnVEKfY650LCX/jBMKEj08wmwIgJ0XDq2fk22psE7iAA5z9o0DZ3RWHSbwhGBwDscq1TkU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-hover.20190726040721_1564114315056_0.15424291049097127"},"_hasShrinkwrap":false},"0.1.21-master.20190726064056":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190726064056","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.1-master.20190717100750","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d8e53d07a542bbf36ae775c57f8588fd7d7e388f","_id":"@atomist/org-visualizer@0.1.21-master.20190726064056","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ecmrBGKOClTUhWCxyAcbg8twyKW6UTy7sDNkdx7MttzREzIc6OM2jz6DDU8bze+exhGtRq63ZCk9QtZjg1/ViA==","shasum":"25b563c07f14a3db2312bb05d3b7ce1761aeb970","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190726064056.tgz","fileCount":235,"unpackedSize":4091697,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOqFoCRA9TVsSAnZWagAAs8MP/0P0BNYGHw70/YTcL5Yi\nNnCwk4RVqpxJeXvFW+1xoMyWhCFuvq5PC3Be6mu2M3dXTpWi2tub+W/gSKt3\nB/8GI9ULkrZUard1vbejmBRV3EU3QLK0IfuocxbiQ1yYN+GrxB6A+npax5Xq\nKFzttyPTbIGyz+O2fo7W2NBviLv+J0wN3olE+e+dqv85WZrQCWRClucbjcR0\naBgBmWcxypPsdXKzs3XKeC3nsTBoFb3muF09GY+50S9wbP+amd54A8EUzXSI\nuL3aFtUWlMlufihJ3PkiG80uXXmJeYtABmGIqeUFtAzKk6zqSLBSSEtLc6/a\nsvbZFabHIVGUbFevn6C5RkHYamgUXfo67hrLvpyZ467A8Ft88OaFmj49bLlI\nONurR3H/XyfKDaKNXFTGkwnMxx97QeLzvcgSHQnGQm0Z/9Fc0rUf/JC5aer0\n0ID5snLjU7xIZchbLTaHVKNkJ5ogqHHmUZ6TCMumRTja02M7D14f+LX4GNkc\nLFmHW/WKcpIZ4anXNmVagb8Y15UGyQBk7UQgdiHV/Aot53O9ahZkCnxvO1/U\nIwW7PrEMyVpi0IpZwLKIPcd0VZQZqAL9ZWfE/FqN/q+pxMF+tuAm5y5vj8xA\nz9NZx/yQlMeapY7Rmf1tOkZx26l1+ZFq//UHC/1elUA4oSZexreuTkkbzh7x\nJELp\r\n=S3xp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQRjG3Fk5GDHvcO9PUPwjVSO/eqIzuX/RXyYUQX6FfvwIhAPT4CLS7FDUJ9xZs61Bv3zo4DXrVia4T+eYF+DHX2TiV"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190726064056_1564123495536_0.15547937870139328"},"_hasShrinkwrap":false},"0.1.21-master.20190726072234":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190726072234","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726053018","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4b8363830d5714dee0ea9cfd49dfae11388b4502","_id":"@atomist/org-visualizer@0.1.21-master.20190726072234","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-cx3zQ4DPOHzJvDijiRuQw7pi8vZKIsDSI06dfKpmrRUdmzJH8QURrxkLFEFnNXn1SndLDfummfSe0F1RQYz9kQ==","shasum":"556aa39ff8b0a72369bd203f649b29ca092daf37","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190726072234.tgz","fileCount":235,"unpackedSize":4092684,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOqtmCRA9TVsSAnZWagAAxasQAJ2quSJi/hXz2hnaZyvj\n2I4K2yADfNtNCdOLsUPyelr0b6avTgrJC9xQDf/p1WdnhijB/0xj/XL+XYCr\nkSgWdW76wmttQ0leMzn8YsbEmDFsLLQzahbWeaoHVeNtmHRiL8aSA/upNhKS\na+Md7Ixx63cebnRWlwmtZR5BMe0EmT8nPDpV3tFjjoXKdaKmbD31GaXVvvLj\nmOJC43Q9VelTUw+Cwnu4oAsJ9Ia0HXiBFzpVAbTQVAiuFvx2iNNiC6Wqbsbn\ngvV4INfFnSna5ifRjzGi1dY5rpJ77+7EtUGWanfixt1n2CmmNlzQwVx7a49N\nepkGJ+7R1ksok9XRCQx9cAqFgrKIePqGRvuxG9vdXkqH5euNnPs9vx9TUPJq\ncCv7TDiuODzqWKCQzxHAZKwtWLb4AR1+x2ze5z95Dg/fOqc9Ew9Il26oCn+H\nEHmT3lItpjYT2EtpSNEJIxz9J0xDJSgwyV/OGCg8Nfnm3WEW9slCHeAJZ6hn\n9p3rHaw2152DRI6Ym0rtRcWxBPxZYfYNReJWKTMn355idlLM0jJjPOK13ltC\n0BNuS7p/9vRNw+daG4v4bjBBuw9GsZ4TWWWvGVL3Z0X/YtYjiVSRPX1aWRPG\nmJKwy9qK5tARvTGjsFVHYOvI4XCOezvCTR9/RdbfKkctx2ayh/IbBc9fcWmn\nFb7l\r\n=5U+C\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHomvwtjso/imeU3mzzCMW7MqKeILuK3m5EgHYqZEAXQIhAP7uJsQrIIZJPrDKRGghPM51wmM9hDUccYBzfRt9/mXN"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190726072234_1564126053402_0.0975306406112717"},"_hasShrinkwrap":false},"0.1.21-master.20190726082718":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190726082718","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e8a42bda7951580ed9acc87f213de5ac29ccbd2d","_id":"@atomist/org-visualizer@0.1.21-master.20190726082718","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-VNKn0ksOdCQWozD/rTExdMG3VTkFkgxt1XDd/nXjWtlv/jumurJli8uKEMNoKYUrPrjurG0G/vSIpbXbzDNTeA==","shasum":"2f473c84eaa4a8885063237f53a76eedd05991fd","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190726082718.tgz","fileCount":235,"unpackedSize":4090105,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOrrPCRA9TVsSAnZWagAAFwQP/RsuA62c0ndvaA8bvNkZ\nUMKQIBI6fW04BACWH7QOoZa8bGyGWhVmFqse7aMZNijVcDIfq5GKPYh9JBwP\nEye3ndb/1f6maoDg2pjE4QvYUwBDvyTsERxUOgIX4pOTtA7OUAj+f+WHRE8c\n+ebIAGIcEcbVghgphQXt8ag3tLUmewflAUtmmULlfyV3z6ShQFpiajI8xYhN\niuUE/X+DNnxNn/XjHG6ImSFPeYn8ALZ4sX5ciDLk6kMUW7saRWmEzqwdp8yJ\nRTx53UBqdg1MdQqhpag4EkldK05bHSfICEU+KipDIpeyFkrCtCe2aixBiUro\nGpLoo8bRY+2LmMq139x8SX1m2dxWmRApAy7hjRKNK66E96zyNvcd5zQ3MQUK\nveLxRxSDGunrs9FxD3nl38XzmcvjlGUD/xpocMnNmVuZaHdilrTkfDUJVirW\nFiA2+UHamGdrmIS7kaGaoB/DqaQvQVc43ajeaOZS4AYGNUCa7Z+oX2Tcp9YW\nYPRsW7QMcmmx/tDUSgpjkxE1npgnESdb4jHAtsCQ9+47iqfrYIgsLOfXNQir\nHuL3jVhw4uVh3K0FkuaITqNhiasQeM4obdQtjGzi2arAJhUtT6TQmnC4IyaD\nHvCzrEYdCEziRRX0DmR7NVerBsJ6YcdmTwm6oeUJZYcg04k1u/XSA4iT4UtE\nZ7vY\r\n=e1pM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCa1cW5thB4E2ce6j0ssRxA1CrCKmielP0uY1RlKf5qfgIgHEBq1jnf4Z/22vZ7ilAfxwSgdxfF9Ddhh8ToVpL1KfY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190726082718_1564129998403_0.5045589797883983"},"_hasShrinkwrap":false},"0.1.21-master.20190726083019":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190726083019","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"31aed3cf93a6c0499e9110a258028baddfe396c7","_id":"@atomist/org-visualizer@0.1.21-master.20190726083019","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-lbl8+tafyDKzqBeGAyENM2+a5bA+ho0MESJZSfyf8D36+KY/xz32y+FutDy5C3gtaf+UeLZZoUm2Z8vqKxB+yw==","shasum":"fb1235ba7d8e97a4d243211f65b3c580c489e8e3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190726083019.tgz","fileCount":235,"unpackedSize":4089861,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOrrhCRA9TVsSAnZWagAAsakP/2aTnEyyag+qVbknxfcf\n21cYuMFiCKpdC0uJYtU38ZRw3HR/o29QzC3eDD1RTr5ppEfPlbeSGLMyZepn\nmGIzke5Kb95YDBQ6IxYIRpXrs5KFeRwcWMUsZpa4AiiN9c6Zm/wf6And3+tn\nDh/LM96gCVfio/G/5sRrxXLu2awwpkMMRJB4XKT7WM67fK5CBE6zU7fAy3LZ\nTW4QUP48FGF4+Jnh9iilhluOeS1yIWluZelWKLiTysdIkY0zHUvmSYqMVRZg\n6T+fF72gR0knMj1wuaqZz87t0Ivdecfcw4Cvbr+PwiOMyqtb8QAmbf9CLY0m\nnBxaPdnCLHN07k76ZvFmKa0sTFpUACfGvm/UaMbGaebF8LoPAE7pz4B18lft\n20Vuy8bDlC03jUqWhfhqCS8/dkWpqUB97esS036Wz1Okp8MsW3Rn2G2tDUUF\nWI8P33Pni70kH10jKJhBFdrkE+Eu9smigcKhGGeZmphleJp8s62z6phlSQQn\nyM8CgRGTzHXK956Sm9KR1xAWr0jclVVVLFkZ1XUxHjAO0QsKpjl2eOZ9rDUO\nEr9uLD94Jpbq378wak8L1QhDOiD6nnkgqr8mg2vygwRTK75WtHFYRa+paxN/\nrnN/rcHJCkIFwuSw+wEw4/w7XH0aBBl8ew5KgjxEQfvvvjuIIx38zD9T6qUt\n7Xvz\r\n=OxPF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDr64fTUjYoos/lN20pjc8BU9TMGV0k/9cc1FAbCSZm1wIhAJ8Cfwsg0e8rfe+zssucmUZhqk+kXAQWh4emlu9l0v1u"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190726083019_1564130016514_0.9342650038805071"},"_hasShrinkwrap":false},"0.1.21-master.20190726083425":{"name":"@atomist/org-visualizer","version":"0.1.21-master.20190726083425","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"31aed3cf93a6c0499e9110a258028baddfe396c7","_id":"@atomist/org-visualizer@0.1.21-master.20190726083425","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-WnjtoYLeZs2pwRVS7gKm5SJtYBO0a2MX0y9/EOumKXJeaF599T+N8hZg5cfGAQ/LeWPuIagG/lcBPCIQ/slGbA==","shasum":"5ea4985fe4b6ca0b46d73510531004e06b2feb9a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21-master.20190726083425.tgz","fileCount":235,"unpackedSize":4089861,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOrwLCRA9TVsSAnZWagAAJDkP/3lqfaIzk5RqrrfwGgr2\n/nBPsckPamYei2u75REj167VdrOgTS+7ei3tS6UTYNcqeYCv3ak/f3r7JAbn\ng5+yi0/zH3s963eYNDHS+j0KyVVhtAZsYplNmLTn8Ea2gPK/9Kd8o4dr8Hyy\nmA/7xIFmga3ze7X9amjYHnUcssYOfn1bRY/4YsqvQYdF0vNGTTCD5p6KzlUU\nbq+CIvWAQXpKaDnnc+gGwlYElAzaLm4WE2j+XuBXK4tn/eMUveWdPmuIuoSr\nJy7IsRX9XFYoj5nlH1wfKhF6r71OxY1zmcMJKJg0tYwCe9tpzO+VgtweF2Ma\nErMC+Wf9XkQcJOLzX+Bsg4iee5mOJy6p16ok1YHulv2ccDJwebRS2skFc1Gn\nihcvYZhnuQhJjNBnlypIAV2KEFc8cngZJexp9HSbtxuWo9GSRRr2QGfcJReb\nDopw5rKoSgO59qyr3B8AA++L5PlBKqNjlKsJjAxFNlDPt7bN3R85HQYYIcWS\nOIWp37KUntwNkxJvZLUGOeLdILY4oI3wvFCbDy2li1RQk8WyyNZrCF2kBXKK\nLuFcZB4rR1aKulh51x6leVA1/LdNRHibWY0cgeqhN8IPY5SA+v4fH3FB72iu\nhF3zqFF+zn+eTcscb7ZdKpQAqeDEgRaNro67ofpf3TFbDD3w/2UI5CLw1McC\nyQ20\r\n=qmZ/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG/Mu1kXM/RbOou0usHOQdh31vvuGTocWkEsNbLYS6OHAiBFyY8GMcmehmqslUTfbIZ2MoNJe9OdHebKbpNzyaxUyg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21-master.20190726083425_1564130315240_0.21036965245291794"},"_hasShrinkwrap":false},"0.1.21":{"name":"@atomist/org-visualizer","version":"0.1.21","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"gitHead":"dd60793c67f59273d6dc86b39397feb511441325","_id":"@atomist/org-visualizer@0.1.21","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ZXaJoOV8Quo9i7qZVWYHv5lVszNilglzgZboX8eLKD+XTIWrDeWx9ZoUQaQZ9XmTVEt7/QRw/yyQKn7Vyvlsgw==","shasum":"068c8c731cf8469bd15f419379ac5967d5cfb6cf","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.21.tgz","fileCount":235,"unpackedSize":4089839,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdO0H0CRA9TVsSAnZWagAATjEP/jURNrtLEaeRAM15VvBD\nqTtYpXbiEv5bloSQqe3DfKdmeI98VFDnIu9ipGUWxDTO6IW+/cJxuA77M0Lp\nC3cAZlwfjrhW9UQLmJexRriZ2XeloGePVDXU9CMAe2DaPRUYPedCimXeArwE\n2q7LF/aqjEdhbpnfUaXMsX9VwYQF+VMjcwKi8qR8YHvUKnHeUfbBwHYr+a9U\n2W733Haprc+qdjyLh7YsG12+tqQ8NwVcsTQJ9XyrULrKdad59zWjuLSX3Td1\n27OVhdXbmwf+hjgr7/W83e0MXHi0icqfVQV+aLGawOtIGWQH6tCyNme76rY6\nFCY30jXFeyiro0gMShAxody6Ovs6OOn+eMGoTRqkuGx9+ctVKpscXMV0W/55\nnnZ4SVqXuFEQ0gcLdrYn+T4wHD1jCB5FLCdRbq9ngvQ3LP5pkWmpQAYNu2YG\nVCDMYXB9DE6+NSQHvG1bMuU63HRab5n+sa1rpPUiYxNwJYqkXCQ6fYJ1U/qp\nKUJki37dInZrtchVCApNLNYjF/2NCzn/h+IqlLz14DrugF7GWFoIZ5KS2rut\nHfSAhqq3/Zq9MtXuCzcrCSdRgSyKRqd9QVFZUkYhaKSK55Ny9bjHBEdRJF6u\nRcPt1m46WvKWvYPL97DDRPVA+kSgIVnNy9wMXYthMnBKojQoEvff1EiLjnsm\nGx8P\r\n=Tku/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC88jZgDBg8HddIcbEeMJXsk2GfXj93ehquE7c1oJFpPwIgSyAXt0utqiqRSSUFbpB0AIndTf4BOZraYaS+O5ZbmIU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.21_1564164595898_0.47125159463884425"},"_hasShrinkwrap":false},"0.1.22-hover.20190726204148":{"name":"@atomist/org-visualizer","version":"0.1.22-hover.20190726204148","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a37b9d5939529c40be84064849aaa9db09d97d66","_id":"@atomist/org-visualizer@0.1.22-hover.20190726204148","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Jdg21GYagHN4RsjbbFjpZMS38lkfZwxSizDXNDK857z2KTYQq0TTZ4Jr1nl1OFemmtUTro00LuHdGyPRdaXrXQ==","shasum":"9cb893462a1fc311d9f335a4403a3fd869dae2cf","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-hover.20190726204148.tgz","fileCount":235,"unpackedSize":4097565,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdO2bcCRA9TVsSAnZWagAA/xEQAJ2Ee4fBKdLlaR3/h02Y\n3y9ZlfKqxg2esAE0JZfurekhB2yA2wPYuwiIQG1yTGh8S82ihLnsMThoFHWX\ny12ZyiYe13B13hziQrDyKdG09gMvqELZrUMhtC3/q7hpBgmdxeRLfkAtHnjx\nM49GEar4G8IZRvjK7J+sk+Vd99LqaD43RhuTd1CGeB41yvVUrEox6peZYsYJ\n2eztEYzvBw76/D6YhjU6NgCseIUcrBFjMRLvV8nNxYaKmEdeQTfRKSZCQMsz\nzVA/TXpPSa6h/VFni78k/urWoM7FTPX9uRvdY3vjmKMC4e1tMZv/fVNoB3di\nm8qmGfb5BrXEwSagazBqFSCu0ydAuZc6WzrgxLNo/uuyhhxURy6dP93REMB4\nmSf7ftwTU49y1VxE0TCx/tcs1vlOnmvDxyHIJiYHLVwg2EMJO/5mZHMpqiKv\n5N3oUWDlJxV2GWLkm73o8ZrEyxNsTCaNHYRKJkDT4L0iTprEybVe7zYFzeHF\nRqdZyTHjgSnyHi0h3tCdqTQfXXY+btxxTl60w8/1HQHQ0N0viNieZjFkX7EO\ntM7fswQK5mm14udBzA7gojmSqVTxq9DaM65s3d6rVsP22Xd98k62rGt02sJ3\n6zVHoX6+YmlVc1lPZqnbXDjf1s2QhlX40m5l1LHeHTDMs2O39cewfhDgFmZz\nrSVE\r\n=3Mpl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCOorG8GmTMLXiQSa6zI6XDmXUsEG09rPxgGDnxmnXeOAIgeR7pTYQNYTrjJ1Zj0ZOZ6R/wvu0jC1qP3QKcqYJfPGc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-hover.20190726204148_1564174043654_0.9342007392337723"},"_hasShrinkwrap":false},"0.1.22-master.20190726211010":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190726211010","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.23","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"06adcac995b88fccf04479dc6d06dd49dcbe9d63","_id":"@atomist/org-visualizer@0.1.22-master.20190726211010","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-lNcCrxhgtTDJvV5T5QxG6lrL/iPW1OoneX4L6U6QI0g249yp8VjmlX0ikGy+tkCHjHTdiWUzVdOLa2+hWhcW9g==","shasum":"751fc967f6a5570276ca50e94a1f024f3e6af7bd","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190726211010.tgz","fileCount":235,"unpackedSize":4090930,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdO20sCRA9TVsSAnZWagAAJ88P/3KSo2HY2JLomLDFuV8h\nMZyY/nI4iJwcmJHnJfof3S3dBtyAVpHQdHoCDGjUiK9VPqInXtbYggeLGh4j\nuJ1sovMnjBcupIZ74UhtCuF0ZumV/ZpZZdd7euZm7qD8Rh++jD+ieFUEhGMg\nndiebcbM4kfCmpAQ7b9/xpSM+/rVmw0xIJun/hqA3X3RcsRZonCo9XepBtAj\njzFR2UkNzwZSOxx+4VeP2XMV6N70L+cI5aoEjGhS/yJ63djlbMBMHJKKDveJ\nqejlHOjMet0jf5UUJpBdGK64wbqOygAUUNTzJm/bukyNWqlqYjWXpHumgOHp\nEmYx/J/AhfEGAGdAIvWG89G9U01jW3MFveU7VoeuSYUNWu2TQpFW3pjm+bLX\nVoGpIIYrfMVnvVboBOYtWWke9/f0DGC0cUbrt3WXUXCEu+Uzm0DlJi9SRC2l\nKpYpx8A7sgH6/bMkfsJwvBj72mufzPp/ESDgT6FQ4a2T4thB9XoRlD2mG/P4\nQDEQk3pYjbTXTjn5YZ1UHjvxdVBnkcprZdNmfUkeZxnm2ZG9k5z6zWxrs4q2\nnzySPjnAzJLI1w3hrMjSOmLVTbRBlr0974v5xQ5Zu+i86qyNVhpE7SLIiqPO\noQdJGRjJrH5pIB5FpmrEY301bWNsL8PLMEsB4xVWXjSrUqZ2b0b0Z+1F+ifn\np5t9\r\n=xmhc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDINMnZ5j14Vsc8SPLhV1ntvrFAJv5Oy4aM/cCP4aK8CQIhAMhrveaYKlK14TqPRdr+L+apnWHZ46OSlz4bq9YN/tSP"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190726211010_1564175660086_0.4582715880956969"},"_hasShrinkwrap":false},"0.1.22-master.20190726214031":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190726214031","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.23","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database. You can do this within the `psql` shell, or use the Postgres admin tool to create a database named `org_viz` and run all commands in that script after the line beginning with `\\connect`.\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"73b8f7e0c7d9652fa8824fc91bffa84b69f5f2c4","_id":"@atomist/org-visualizer@0.1.22-master.20190726214031","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-/fj6Qr/aKsaDaLqMi7LCtA4x9GjqkoXiENHL78lRufGdnszFIQR/8CPvZxiZqjWA5H3siJz9uJgqNMmYrgQvGA==","shasum":"16ef545b7b023a95907a25316d0f6cf6af57aa83","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190726214031.tgz","fileCount":235,"unpackedSize":4090930,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdO3R2CRA9TVsSAnZWagAAEc4P/3J1H4dl+QrIV6CfFakR\nurCd4K9O7V26mqm/OWbGETrySefkr3kMRbThTd7XbpGoTn7AwHkdDYHfhNBy\nwYrI6I6sUTxk2xUVSioBi56YjwQyC36CBiDmDjv5Ifqbj1K+1BcRoPLCKu+f\nntASMO07YCIChixdTRU73wgaRYCtEcse2MUHWbmv5LrZNhTDgAXIzzx3U/F4\n3uFwh/R5+zm7s1T5y7GkaJbR84YajG7MRt+kv+rNO2XRdjq+kQmg6zHt8HOP\n0s2h9KfhIk5UlfNejWrSRiHgI24vJL0ZrDg8G0tMxxQPmBtK31F+GzhE6oym\nz4i7OpzGE2y1Bos7WrF8KUubiHsSI7x7Z/6mV5wTGCRBpaYm+cUMgD9J4R7V\nhVfJJBn7NUUsnqwjjh1suA5sUfg1OsJ/r443VQ3kQUMWrRvzmBe3QxVVEduy\nLFxP95vm0mcPC19TcY06xhEbjvgv1CvJ9pSGg1E9b/HgwQWfC4aBMJWLLgTX\nCBBFCAA1uVPu168xec6pX2UD0b/GdvSX0tX4/zo19EWAlTQqkce6v+um8C70\nzLcEhHm0kBmWJkCx09W1u+ZJ7F7n1NOE0AISkY/Bq09w2NXNjofBIL5D055Q\n4hUlRi6BfDnTT3EWyNgrzmNFdEwzWZ2SGzsUbbPzhFzIKQ1nit7LSLP0Pybf\nxhpM\r\n=5fc2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDbARHXt9HW4M3aqFjXmU4M9GKY4fJcJhmP4wnunpzugAIgOcTQtstzT61tWw7r72xBk3NnkOY5Aajyet98iflpZeg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190726214031_1564177525452_0.4967589494221083"},"_hasShrinkwrap":false},"0.1.22-hover.20190726220021":{"name":"@atomist/org-visualizer","version":"0.1.22-hover.20190726220021","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.23","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a5e0eb8a8474d151e315165535db6c8dcdb5fcc7","_id":"@atomist/org-visualizer@0.1.22-hover.20190726220021","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-yMF2W4Wudxo4+2lPSUxsBzvJE9eMKOvs72esMVj4uaDVblLqAiAOMUdP+4DPi30eLET9yHCALC3sc0hRGQ2kbA==","shasum":"37d3c8f26858c1c11bd1059b423c29c31da84faa","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-hover.20190726220021.tgz","fileCount":235,"unpackedSize":4099423,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdO3jlCRA9TVsSAnZWagAAcFQP+gLjnWn9Q7noMipdkg2r\nn6g95EqBmOnyNZwg69gsDDAiSjI+U1VPxJJE2XyGZRGtW3AVb4W2sFKMQj75\no9srDRpdXnHmb0j0VHTJn1X0lFxb3OH3pQv+xPBj0pqVN1DHrIFMK9WFYpFu\nF9KvgyzI7a1P3NIUhXL8JaTbKGx5NwHl/Up44/HuUROyTvPRpG0M7w0vTBT6\nMe/zoaepuoPR3Ho07VGqNYo6lftCeoQ2OO7zXrGg4Ki7n2qqsXzrwROSHZWL\nfx1TofJbAkR83AzZNFPR+W4hfV8UaYGzh3crP4kK0QXfDx3dyjagftSmWRMw\nO04/Aza67C9Ij+aOS8/1BVDM13NC06TYO+QIx4tOmO5XzBVKvRvEGdhYqe34\nQ7HaP1HpTByV99FlYrqkzeOy2qJoan9VXkiv0Sc2yvCjfxgEwoFZvFCn/KN4\nulHkDFnsXZ0ci9E66W8gA8HHHT3HgX3yTL25ZF6whXX2uummgRMseklgixmz\nPUBNxbPUHr28OdboVJ22zsJQjxo5WS7WpdZ2NOMSZs56aKwfBWNC6gpqRDEQ\nhDJndafUgLla8ozuaQQZ2J1FKPtJMn08nxVRx0mkcawbaX1QWp8Io5oB3i3s\nIRekodTtZNQk1iSh4coqq4snPknvhsZ4UzDvHKRur+USYRf62/ipp0nW4Y9Q\n86Kg\r\n=24ZK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1FP1HHLApbqeUFjcSAjTdJUlOhxOrtX7jlE1hNWtPQQIgSzE/Sjv54E7glcVPLhHdHFYW42x+NSFVANgywBy4WEY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-hover.20190726220021_1564178660722_0.37778396064112574"},"_hasShrinkwrap":false},"0.1.22-master.20190726220435":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190726220435","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.23","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3f93514d87ddcf3964662180aa59f136aeca0ae3","_id":"@atomist/org-visualizer@0.1.22-master.20190726220435","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-KaVUe1/dyJWpDZFIJmJnxmE5x2VifRKV0uVdjcCN+1aJMBri3omPXiJN8kjjkmYnWVgoZr4LegiTpCB/yVbNAw==","shasum":"ac9b518ad9d06a9f7f11a07d6a604dae03096489","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190726220435.tgz","fileCount":235,"unpackedSize":4099405,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdO3moCRA9TVsSAnZWagAA6hsP+QFSEi0EOIBFODqlElzQ\n/QqS27qr4/tslBEv7I9XvzYpsgHbBMnK5GwceNPVeslKGOIUlrJb5rUkdxH3\nZR5J37P0X5ChW08o2HB5jfXbMGPtlAYReU/xBN4lTJka4jPlQPge2hZ0BNuf\nH5ftvlxG8XTb+jSP9nsXpG/xKXbKwItcjb0GcE90j6qzkTjKoV/OOFdcpQVd\naOLkMkb6lG7j3G78z2HYX5KhP59Zdn/gwAVC2aD73Xh2DTnAS1iozoY3kqFC\no9H62Rzlco2zfdd6Fi6OVf5i+sh2fV6dy16fiCmMOPMXLs0UkzXacwA11mWy\nXfaAv23k+iE9vkHlPONpxqvHOhhrpxUAif2hQKr5/USWXW69Blrqcm+4RPeq\nqMzfWd8U93i16MBK6UwcJKbml/i7Dvy6GiBF9dnfO7w4PB5M6RVqA2VbHjSs\nqs3xB6cQ1nFc/g/yCsZIV+rjuVgT2UvQEz5119Z+bwnn348LahhRI4AMHU05\nQokzqosTwmocvB+Olb+4Z773MjffdXAorQ1PWEJS7PEo+bIO8MfzKRer4wLm\ndMzUqSbhIpbI9LjKjCMKPXQd4JiUfSYAZqwcTJCFvMn06SzUTZ0Noea5iicU\nv983NPIzvgPrnWWpK+RnUQG8tQ5BZX6we3kbvPDzd1nn/luTP294cGyUN+wy\nI17o\r\n=O3qz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHaCUoi1poHQwqgy0Xv77E03rcx+T6lVpqNSitUq089qAiEAyd/vjOpCvUvJHHQXQ+LIPIe7gpNqEP6FkeCgDfAfA6w="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190726220435_1564178855243_0.6759924181814652"},"_hasShrinkwrap":false},"0.1.22-master.20190727000945":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190727000945","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.23","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e0b1637bae9aab18d0e4cc30b8a419cca71f7085","_id":"@atomist/org-visualizer@0.1.22-master.20190727000945","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-I3bPnhC8mVGrjp8IuFPa6uFpuCzqhRm/o7pyJJMwlnlvsaDw+cRUBpc2fIfCuepPjaR3EzK9WdZLzd9UhtmJ0Q==","shasum":"c7fd7e2559a3f4409f842450abf47a6716bea3fa","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190727000945.tgz","fileCount":235,"unpackedSize":4099977,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdO5d5CRA9TVsSAnZWagAApXgQAILjfxXjuX2kLR0/7eQj\nT5K/VTr2hJHZCFt5OQa8XGMMifkdGVxR7L2EClnVFufxSxi7/eN1sGp1vUMH\nCeXjW43elVvOWVwsEaaEBc3hEbgAq86eQbsLFdzxRXK8XF7ebzQigNj4MVmd\n7QIEB8Y6LrDFSN6+d9OVxcfQ65o35CekfZfl8S3Znji+KoDtd/HqW6aezutN\nJskqhA/AXzwsOpZOMri0zfYMgBuWPX0o1JVGmCEq5UD/oJeUYMWU3GmjO8DS\nwMiyhU9hjdn+O9e4tlsTk5J0H3cST0/YfyzTwTNfFrwN+WN3WNgFqBs4ptdl\nSd8ESw18qoUTpWmxElPXiIO39L9mhYpwyowwefYOTF6KCsIqc6Ihl39F4jlH\n51J2/ALukdBegfNsgOhES+iO7tTQgldk12t7jLLtabsb/c29pfPJl3iy4DQZ\nhejRWjXZapVa8KravKg78DHt/SdelN6YXLgMh16WoqzeiT9kxSevysa7gX1V\nAweU87QwU68Qbq8cG7DkAlRvpDB9NNEs3QabUf6Vpo5gAu1I1yqD4gCyIBWQ\njDPBu9Lnk+PEHmDwXsba0oe3GJnfwjg7ARb9T6PKD8G3ixCrxN6h+uySufWk\nsvVP9Q16GcPOO7MHOGv1TAkjpc4JSqNDUgkpxpJP4FXzm2k190MzH4J+L5ZY\n4d4T\r\n=2yPk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBJHg7JrOkFxORiey/IIiGaM3Xasi9OjihlK2NsvHWmZAiEAnc6YzW+X0AWfwe9SSSUxWyDSx+hZ5iOFzMH2nwcgIG0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190727000945_1564186488449_0.6180401692749411"},"_hasShrinkwrap":false},"0.1.22-master.20190727004157":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190727004157","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7ff4245d88c5ca8425541892e02798e956b8525f","_id":"@atomist/org-visualizer@0.1.22-master.20190727004157","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-dCNQPIdhUgMzDJVVLOv2gX1VVWDz70iz1Cx7spHycEEVN4OPsXU/JYUE/c0a/8cOsNDNxu+BvklloSNPJmks9g==","shasum":"1e7fa53dde450b0f865ec0211abd159a33c57135","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190727004157.tgz","fileCount":235,"unpackedSize":4099977,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdO57FCRA9TVsSAnZWagAAejEP/2r2qZbgGyvcH8PdzQ+c\nIZF/LrC/eI+WfCec+MNuMIZtT0qAkZC9wyNHTzp8bw74oHc7vx86/f5aO646\nYYJj84393Ajiv0LRpljGjf1slNnRIJoXyIZp2qnkiL8HRrxRJ3mF4uzHTZqm\n/3Vs3eTLpPoKNpvEKC7n2SPaxK8BznWNDOAjN0v1iWn6mqsd/O1TSM/kY/MD\nWPqfXXVrFNFkBH78CzaTOvxjegcfQ3SqV5BVFVTVpw0e2eOKAtYh0WhOXBEy\n9QJKfFyyoGidh01cccp4NYipC7n4CgVCaW/3A57UROMPpX6Nql+M5lrIzj1p\nvzkcR3XRMQsaYPU3QDuW2sf4iuSsP8ltAGCBNM1SFWn32/usApmxVctuMbD0\n1J8xX4dvY4hvYsp4AG1CtPvOeI0jcSBR1jUmG0XJG5S0GIHY5uPL7IrBhjm4\nXLVz3Bad+HsU4OzveFQXDeuIyXFOpsC34SmEFrN4t/URTEPBJCPH6lNPhS7O\nU4hvo0Y++hv8tuhEsYIbz8i0bODWdsNfo7YSCUnBvgE4dPjkUk9vTM4mJA6q\n5I0Cx8zwnstLR6NHYb6lS2I7vmVsXTSw8olfwtW4sOTZzEPXpulRgEowkHcc\nrdYRq2S62LqLHMA4ZN+ySqS8ZDrEd1VunWpjWpVGUQj2/6ggrGLavKw+XIuh\n6K/e\r\n=Kk0w\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDdPipwbzlOuncsOebWefIFT5bgfEDk6rHKz7Sbyb4ppAIhAP/euiUXaffUHX9WCy4u7iMbpuS7vdpXkhG0Cqir7ipE"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190727004157_1564188356624_0.9643426185894219"},"_hasShrinkwrap":false},"0.1.22-master.20190727070328":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190727070328","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"95936c966afe7b78def0e5d372a7bdf70143826a","_id":"@atomist/org-visualizer@0.1.22-master.20190727070328","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-3YRrC0vWzNG/C7zREmbXgEifb7Pk9IwiFrZx7uZbCVTZoSVO+t0fDEDSOoqWSrqQlWe5280ohR7Eq9+CZg106g==","shasum":"34881e869e032e87dde62458873d080724dc3c24","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190727070328.tgz","fileCount":235,"unpackedSize":4100067,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdO/iLCRA9TVsSAnZWagAAMuoP/jm5DPD8yimRrA7EImx3\nlXIuGtTgd90W3JoqcNurkSnnSaZcsa8m9Ap9MVbuASNXyAPlKE1eHl38Mau5\n+uBycrkMYE6zPVBTqOVS/1jbFOMs1C3f8G0x7HVeOqDn5FxBVDIgJdFh3kie\nPTAvP4mdjSgJnBHcOLBe9ttDCcErWweSRb+M3W+i71WZJZEgS45slQ6LTQcG\nMtfMhmqVrRKH6PEMyDbM+l8NHK9SGKuM69UXfiy0sgDuoizMDfAzfl6Dxbuf\nP8p5qFApkGjHtL5ZkdhMLBFYH8ZuqQXB1ARjXt+k2a4KFBdiuvhM5lJNOHju\nsdtF5W9K0mP+YtAirqv1u7yXc42mrpy145d7hy69H+CO4PlBrw6Wqyh2mgjr\nx0thuSEUkMEDu3lxmJwygLIZF7G+zpjQ/E0gBcetwJKr6kVQ1JMO/T/7afSB\n7lmx54uCvRSjBBCV4hCj/gojHlf485/9vUOWl6xbVhytcVCmQJwoouBjxzPi\n9uynF5beQaoxHoK3xKUWgb9akh9/e1sklwIza/vd/iRmydiq0mWZk7ghXYgl\nzj0geFC3iwdzKIP8wBgl1sygZIypSvu/RpNqU4l10s/VoqkrAc4UxnZvv7dW\ncfNqf9uytakPkrtgOuoc6ffoxwIQRfprf5nFSk3B8BPsD4y4y3vJXXB/2uRf\nEIJ0\r\n=mp+1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHsMAXODqW1IRMgDrTc8FdVRD8iVKwNPsHw0SHSNgqk0AiEAgMmJ6kG9GNudMazMHhBGfsD8nJYzXWuj+TOqX9yJeEM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190727070328_1564211339106_0.08504603263898591"},"_hasShrinkwrap":false},"0.1.22-master.20190727080323":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190727080323","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"00c75fb96673bf97926401b808f0813066d6d570","_id":"@atomist/org-visualizer@0.1.22-master.20190727080323","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-LRFuNzoMGk8/ri6ma6zpxoKjVPvDHt5fEuRCeghZl7xODlUe65kI+vqEDDRF3AgsQ1tpZ0N9uFR45rH67UYRUA==","shasum":"357cfe4b817f890c9217162825938911a7295b05","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190727080323.tgz","fileCount":235,"unpackedSize":4101150,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPAaACRA9TVsSAnZWagAAxUsP/RwkY6yeB/saHxVWbnew\nyNIBtKttHyAFENkIksHlkIeR5idl+NASRAQgtW8aiZ2/ohUGuhP70VIN1UgD\nzq6c12AjuJJLQacIYwvh4lTFassVbTAnpbOQQq9DjPKQsgIsvhSr5p7wCn6J\n1k4TamNxOP7KVt7LwnKDdfoRDXJIky+wPmYHznV307ZBCk67/kMbIUIBRLaG\naBZY2aReFgILn3n05Mq55Mi9eTNAgmdsKn992djdsuTwINSH8JWvr2DpY3C3\nnlcNWCyrIywN2dx3wxzM7zMPFgGZNEt7qIGCAY5FU60WJQTq/8o7vLRk3D0P\nltg9HskuqDkUA3609LUygLLSdD+JmHAkVtXinb++FVLaVS0ADJ0WTlhCyRRI\nMboknJk2OD98G3hf7AetxHa8jyBXwklLr06QWna+Kc1xAYKyL10WdtSHaxfn\nN3oTXf34LOc1YKFJFxyHKtkGGMi5uPGVO0/HMt8KVdpxXAPrir7rqHFqZ21s\n1yi9QdTErBLyZEzPBYq1hlLthf0cQ10bmyFxVEg/TBnU+3jU3sq3YrnCYiXM\nb7wDysCsbPdGQu8xIY5qOTt8OaZC1ZyEAGzTFAHTbq0fudysHhv5BQrA//fT\nPFlD5fW2eyn6CxFggYg0LJ82gL4p/NdCDcuYJ45WLXFzhhwVKNqqZoHuD6nE\n3Bqb\r\n=m+42\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE6autRnHA4AArmNFqjmekzJdckHWgRSe8endD+xpK8CAiA/NiRw8+dOW7oPtGDq0Brb2g3c/TUvfbWjns2okpUhYg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190727080323_1564214911473_0.9969970423188321"},"_hasShrinkwrap":false},"0.1.22-master.20190727081757":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190727081757","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.6.3-master.20190723055410","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"16946dead27253076d13da8b997e05aedac6bfe7","_id":"@atomist/org-visualizer@0.1.22-master.20190727081757","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Vr10gLwYbMkjTOgsu79USdvx2zlsVk0/cXxGK4fX/vxFjikRzviKtlmMgcMIDlZC1P0LHzZxGjoDCGYMvuHpNw==","shasum":"f20962ae66e9280d957150aa8c270797324f9c4d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190727081757.tgz","fileCount":235,"unpackedSize":4099983,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPAn1CRA9TVsSAnZWagAA/HQP/2RneX0RusvlTIfEa/FN\n0ZwgLke//scNSBXF1RnXZdPkVO5QlAFW9CSBFQORbTW5wlPzAAmuYGizyuuy\nXLimUbhENmwv5Lyc7tD4hSX0W0EnzM9cGLUaUNTnCxmE/mK8e8ujQgwfLjKE\nfK2xOrCu1VXqNBV9k0isxKxVHKyRs2VQsARVCVU4/S+dHd1xpvfZeWiSkCcL\nQ1cHKq02pj53w8+7qg5mkiafLalBzJs5w/CZUeufR79MVIFDuFYqw705dXCX\nPZ6zTHrsDu/4CI7AyZBQpjEPRa5DSypniwtEy+ScEOOQrUk+iFNkWLGwZC8B\n65hF6uYOu2Qg4UyekgL5aIl3VRPsFFl/RIKDUzUjB+0itJpM3Tu0pW52QjkH\n83TI2SglEyUa/cF5bdn3XbO1YmbyeFMB9dCSOiDMhLpqLGBEDjn4cgs3/3te\nd2hz4UhxqvMMsLDs0gKhMx19k1LUHUi6wrdWuaw0YzSHluqb49bzrzIHTbFN\n6drziJXaCVkIrh6eKQ6bZjLKV+IQBe6EKGlAE7uQmVh/LjDZ2UiaTxZp9OrS\nPP5fLhh8Qn8uC6WRvxnEFSLdhIIT03Lt2A+oB3DLRfw7N8/oE4GeW8xSv4Ri\nGWiDvD8PZspBeSZcHHAAVAS0fnbRDiBKStEUyC6WaXrBqJx6mm/0tNiQHdLT\nCKFV\r\n=T/26\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCgXnBHtZID/5bdiHBo91+ENvexkqoydEUFbJcWHZWOEQIgGsInQ+ZnZnHODfI8ZbDW15zXX2N5uEfmmV/whIf36cw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190727081757_1564215796521_0.19689563671534027"},"_hasShrinkwrap":false},"0.1.22-master.20190727084956":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190727084956","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0e655155b1bc8ad7aa29e1dac15798c04e39c596","_id":"@atomist/org-visualizer@0.1.22-master.20190727084956","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-H8clmHNOanlyw/Zre8Qa9+SUOcc8cfORW4cpMMmkR2soEAehQynAJb3aV5dqX4OI7pf1hqdHE87a9I69gP+yBA==","shasum":"c197d801a7983d5ecf46b84616d0933fd9f14471","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190727084956.tgz","fileCount":235,"unpackedSize":4100089,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPBGTCRA9TVsSAnZWagAAYfAP/30TMBmTqQS42XHrelwa\ndpH4iTDVWkH7rojvaZHc4q0PFSMMfBUIc87Q3ULk6znG3Q8QyVjcGvkxuYOn\ntAUxJnRQCKEaT4CNDC/u3pyG7rYN3i8HFEN+UyqXL3ZBPZwYgt6yVg9ahIie\ncwGKX7zj6YRLFLoWl4ZZdAxHnPOs73I5umQiBEJ6AyZHpF2NbknB+p7PXBWq\nwQzC+6jkT3bbpEJrthfsfh+QSib3Gi43BvvfwgmMnpKJ+B+NtxSuCr+dZZzH\nVux8GgtNeuDOWxzoxc9a4cg7M27M8pyUf9iqcJwK5G+iX4TRIBANKPrhxE7+\ndW6k5Eh0m+LpA3ES7V9BpBi8lW8ZmJcNV2EiHXqozkEE5dYFiUd7LhfPDDyg\nddo2672nWFDKEjX+hmlTdlNJ+1mE9g2ufUesXkxAFV0Bpy3NuTMHAbB2Bz3c\nQa3wxGquMKwuzZIXcp7CmOZzFe7rDVgLRzdiOexS1UL8A3q8uGFBCOtRswPu\n5KvgN26HQtmdzKyiy+pEsz+0+Zi0nndFGWpewkDiTkcMjb/Cv22zj0ERq6Kp\nNQWxfucw9aEz6Ckz1LLSJ42S8gmPbW9PFtCGJlRU8TrK1OpKRzYg6fvHIIE8\ncSgOfaPqp8CLUhxshjslvdXea2gSa4ZmCEVVUNJVjZUI+gffbZfS6FGCQZKx\nWThl\r\n=Ktg/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBdeVKfTlZLhjRrsw/ynvJ8MnfG/L+vLVpRSnypXYUVlAiAUSmeLVxhT8p82aK2kpqtbRgpbyDg0eEKdcRBpj185/A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190727084956_1564217746228_0.4465183810585993"},"_hasShrinkwrap":false},"0.1.22-master.20190727114412":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190727114412","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c52a11d37c17cd16b99522288850d86d6ccf45ac","_id":"@atomist/org-visualizer@0.1.22-master.20190727114412","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-50w/yBtPEY+OPwlEl+95txgqE3hogwioQKWG5A94XGTQVF8ujyfgcUoI2mB2YQSb+q9kMvDOFnWOo/VKN6aZOA==","shasum":"2e99a450ef44197da04435ebb07f260b53074d9c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190727114412.tgz","fileCount":235,"unpackedSize":4100244,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPDm5CRA9TVsSAnZWagAADGoP/Rm7CFCj/BNip6+8o4fw\nSM6yk6zth6J4wtUp2U0TGQ+JULzibQRO+m0nW1TtgrrmmXPSMVy9W/vvWGih\n/C1rbQvRP/2RE4mjzV28Wb8pILj1rjkp9zhItCWjPcCVB9qT1ovZ1VoVT2HP\nOFV8Lqz9J6BpRAILPpldt3iNUL9Y+JFE0+gYj1fJfee80Kl7JC3KohTo6Kxi\nXHXRZwf0QNV8FLdeZz/zpY4GpNfULSiK+wkXNnH0RxvoVFNv9LTg7ZF3m1bN\nZmNH/XbU3/kx/iqiHScHmndPxU/cb8qi+u30qnVe3r+AJ1qbcU7LKZ5R4cbi\nKH281Kj22Y3tqiOShGOq4WCxrMiNWs/utFkPm+aFdmHc59icVx0PGu5cFR2W\niOq5ixxoND3+Z7l1f5m8kdun+n5kLYXnL1jVnk2FJOLVsaBE1ge84Cu0NW2e\nvbTFF0ar5lcQfKQNmxSH8UwnY76l/y9iW1aEMzJklg9T+9OP/4VlTJrm/dlU\nZU+7DeUmu2RbJNkqgovIW4H+tur24srCPmel+z0AbM3cKCcdZjUCE6M6Am4b\nQyj7KXgzjzO0tW0FtrDHG62r0TbFfZYeaA1VDUn9jLyopG8oRZ91mP8ERHsv\nHEjPVhrKN4tY9RKiy04qSbKOiGljJAHiu9i7BqjAyj3NGUCZt2+ZLtZCicPk\nE+MV\r\n=bnAL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCCfQiHse8+iTq5heUR60DPlDUvp2ekzCaYXcBFQFPSbQIgCcGauNVK5qIgeNuPN45wx5DhWJxHBGLXPKPNCrTABF4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190727114412_1564228024825_0.25802507406108166"},"_hasShrinkwrap":false},"0.1.22-master.20190727232909":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190727232909","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6d93de14c46dca1f8804039206860336aa10d1cc","_id":"@atomist/org-visualizer@0.1.22-master.20190727232909","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-wdcH6TRg4ZyByBTBxnJaBXVj676vXj7NIs0grnGhCrUS2E2AbObcy1IKp1CjnGylE7kBlwD6DGfoqVT+c1V/3w==","shasum":"0c53bf7b8e9902d13f1ce15288a56351949dc306","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190727232909.tgz","fileCount":235,"unpackedSize":4101409,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPN+bCRA9TVsSAnZWagAAl+EP/A0ZhYtV7MXAPqu5KVEj\nBa44DC6VXEdNqcJ/JzniT5cfUJ9D+zW9ycWxI08GBt4GZ/klIR9dXN9d367L\nrSIqtoJbPvdQhTVYjTZCL2u47FdnkXELtGJ1xQ9re4bdrwIeNMFVTb2KBUfd\nRCVUCtZiD5huXMqOT3KF2OrM2y6t8dVW++Ur2J1/X8aBPsDQ7yQugfg6vAD+\n7QgDTt8q9wnW3saGm2gZPib0YE+B+Rz/s0o5XWUCUDwBrQc7qeKX/7LMjOoJ\n8d567oYZzilLXTKHAKKS1uuxF0+26ryYsPlTAuFZlPItvglEW5YPoFPphnJX\nXyTBaMEb/H7MEBeAdEFkXvJwA30MOGgq+tnwJaaCnc4OdBpBIyRrcAltH7yJ\nb90yBoSp4EJAgIDdZjvD8XIdO3bv1putQoAP80/jqFgCLAh9Ivqfw5+WstC1\nl4NW/JynxyMYKLD0Z9Deez85VWhpv9com0ounLPhrOw7ZyJ5XTqUoKtLU7XY\nzXRg58V4QLlzAMoNJjVPUXhv46eDDIKdtKHBxyzpFULjTNaeNeQtK9SB1/96\nIwO+nAfxGb6ndnCfzFPhs4Unr5IQFVnLpqvZhZD8FwKjBTKLavd3XhZXMFe3\nYmon26F8qNQkTvshXc6E/ZDN2JBsE+JOmZ8XfsmvSam8B5DaNIWCMLBJ/wC9\nDzqs\r\n=5EYA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1JsOvAvj2jAh2tWgAKlOaQUJPsgTiUzhO8BuoMo6HdAIhAOFLoq9yLWSjf6s7Lo9zvBrHgHiyXbuqOD/ZCBtLyAdY"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190727232909_1564270490337_0.9866254927381299"},"_hasShrinkwrap":false},"0.1.22-master.20190728002738":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190728002738","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"be0f23337363540e2c6da1f7c8a7b03ceabcc7f1","_id":"@atomist/org-visualizer@0.1.22-master.20190728002738","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-U30iPWG10jsbMccBvbKr21RDAMaJs/DtGlMH/UPaJLjjGlp8ViVaXOF9I5Xg2L/7/Xqm6Zzhcg2pV/10rzCGKw==","shasum":"54f57349c5b0968112d2db480710ef378fa87b65","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190728002738.tgz","fileCount":235,"unpackedSize":4101738,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPO1QCRA9TVsSAnZWagAAD1oQAKLYRxnMZa+ZT46HfXfZ\n5Bo6mFNO415RSin1kBz0amZI/xho2jAij8MF/A/8GJ6h5CxpJySGSUl10sd6\nVw0ejeSKWv7IUjjobDuuUbwmSn48EqgwPJ4J/w87oOHok+0LshbCOROUoc2s\n3Mn78c4OQbEDE4KYb/kG9DEZShzpi8rX9vQK21kFItFuYrlaKhuZjXPYVmHq\nv5e3o9azwMrZzeejfpUgyriFDs5CAX5S9EEyDgG7NPCB/lD2sVnkqUt8Q8C3\n25PgOdWDrifOWcwhGZ5psGAT9vJXKkxgH1S9dhn6VvGcbBwo6yHmMzDDDMRR\nmBBBfXjYAvzxqRarBMTienKTsxmBbPeU0akwCHhNXGEQBEavAR8q40iyOy+M\ngyG7EMe5AKaAYA2rwxVamvBLfPCRIutlFc8TEUKqcEuNxPteEqn/OCL2mhH5\nE1dJedgS3boeE9Bau050DvQ3TMS0/hvC9NX+0duZLSn3qJawfW1wiChTmW2+\nK4pQ3mZ/oiHalQ9QHlABYC/YLRSl0LtgRWk+WgVwnTyG205FjT7+nxrZDGBu\nBKhCfarN5p5EMoHn5CHUIJ4yWWMOLD8QUzyIeiCPWrCxUub9vA9JCP2OqQfU\ngeCA1nGVxRnVmTnPH5Ll6YqVhaI80ViOJNI4L8oX/luKALxFbH4AKxkkY8iY\no5VF\r\n=zjZM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPL+/ZktDJ0yQhRtUs1dnUxotLvm8Ars2gSmaND42oHgIhAJg61pUptkMJq2LF8ev+/qevQsWU9FdRldmcERrRM2A8"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190728002738_1564273999844_0.9291826654593769"},"_hasShrinkwrap":false},"0.1.22-master.20190728034709":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190728034709","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4b7e6dc3c97aa3e092bd6bd7652218208d135586","_id":"@atomist/org-visualizer@0.1.22-master.20190728034709","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-g8K5veNn+ujia+GHsPWVtMPVo82p27er//9XJysnzs9yb6dkR0uY70ckETMRww/ySQF7in2AH8QanMz9OyexEQ==","shasum":"8f492c9c41def288059565e973edc5c9433fcc71","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190728034709.tgz","fileCount":235,"unpackedSize":4099111,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPRwPCRA9TVsSAnZWagAAZhEQAIcoPqPUTQRBUwVmvnK1\n7HL4VliHdcs2bHe8s/yxC8JA5nQdxyEaC3YQG+35mcGJKUOK/+QRbv59WMaJ\nYzDe73qEfFzv4hApAPjVGdBPu1KXJa0x0/QUSSkGVUwTE9Z+jMv9NTnucGUV\nNeywrfn/X88tktqcjRkx+YawXHXefIlD4OJ1OZnEaRfHsNJESXE72Xgdzsas\n1HsyvO4LMLYZPJrPhSp5z6j8d/tulEpgTopcMnuhW5IAdQ8EFpG1mYcPsRO1\nii5xbw1ibQD9/RnjLlCYzel0YCoR2AcLYLkIK7+lYpE7aBjW6y3w593qqvR8\na+/MsmXtwmiH1A7bKBLA84FWzriQB12EWkjmkTU6+RklPrS1gT3Z7SVuiK/U\nRnQR34Mw1k1l2CZIIlm0WoEUQhN7zfb6Vid28WVWm/zMmQbCrORtT/to5Lli\n9MBFMNvGbjMQODODdJ34T52P2orZNYpYErhP70q5RcAuxD5mZH/TBn9+jzeL\nuSK255DJk0i83/+RJamMYUwkKGpABrscqZ6NwHtjmD0vftzTXuDBeK0G+YTe\nTxPxYaOcmjAkngHmVlYFWXds6drHlzTHoEkys2IP1K4CsH4EKV85Gtsz+H0I\nG3JJukuIBYXbJqc5L1eLwnVzOOukzPMt60lt5136z9n+/jbpzIuzmx5kQmKQ\nRe7E\r\n=8BVV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFnNZC0jMVw5utXSVMO5ShTeC6tMuqeVp72XyFoAdyhEAiAt6lqBK3nuUzlbg27yWXjjgX0/UrmJiJFpbdMvueWgBA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190728034709_1564285967272_0.8432731019587318"},"_hasShrinkwrap":false},"0.1.22-master.20190728065307":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190728065307","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2563d1b07a5b5027bb97694122222e4de13b40fb","_id":"@atomist/org-visualizer@0.1.22-master.20190728065307","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-tlhSla05oEcgN2HBJXaOsuiG6hG2JcXu1goX3TGQX7h0JuF6MbSVbVE/L/L+74oN/YMcSaoCVeNzjdakdQblsQ==","shasum":"1430b40ff19a8edf419d44badfd921388213f819","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190728065307.tgz","fileCount":238,"unpackedSize":4101199,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPUe2CRA9TVsSAnZWagAAcbwP/jnuy7YlVzR8HHKQRiBe\nPWTN60PutQHTTufrlJXCFSYeXBuiX1DAQupDXmLYVQRijXQKXAwK5P6zKCV5\nMb8zczYvXYWTBPL6MwmEU8LjZ0zOQlGBz9SvcwLJquf50DVwIVEUjeRd6nQu\nq6doONbYuyGJu/8icQ8M4Myq8UEIAgqKWZOJ4kCS87G5naCm/shBF3whJNvz\nirpSg4bMFWo6+umfKZse+rxtkyrog3VHjcRljrt9BZTbMcSo2tr6lggXOqDk\n9GGyI7PmGRHVEVYEzx9CIcbupNaLVrD1P70dqVkrWPjuBuUmOo8O2/TfYM89\nEsJxcYR7/Ul3gr9Pq5+qKSiMv5uxhz7ACKzOtHvzDMQSeWa5cr4Cjx9Rj93u\nhIPK5vCLQ2io+oIK7V8UgC2zm0v5oVFX3AUV6c7PAKOtRlo/6ZM3LDSIeqDh\nVn2iArdRoeWMHUC3t2YnR1Vc9cthifQbFNIPAQvsheLo9I3kQRCdaxYy+0/N\nanwoiemKBm6hELEL7S9wBgkDD1iLB78fEsw0bQ9BTHJYIwp8yhvbH1K5nswI\nd6p0zETzgO59MEAlxSD0eIqKHQflyV83zBpmTDyIfNFWlLD8n59ss2FPsUuJ\nd2YIGGsmjnNVKv38JBcg0ckAH0JB71Nq1ff1idfOFXZB42T3BmKKR+z3bqhD\nkLVp\r\n=PCxb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCAQBnc3cxtFf9opNYiMOtZfSrDEURk4vuR8XlcIRIEnwIgQAk1BHV2OouNPv/3OSFAX4Jl/21L+p+xYpbiPRp3nzo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190728065307_1564297141356_0.8504931322016265"},"_hasShrinkwrap":false},"0.1.22-master.20190728074838":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190728074838","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"80e9936ab53d761310cb5ad25c745851de4b881c","_id":"@atomist/org-visualizer@0.1.22-master.20190728074838","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-aJrHOujYwNbL5wliynq5zgYbegZuPCIaL/6RdqPDUJ2hIy9T6tMp60aH4SL6hXAXkqGz6bQH/odrMuB3H2TKBw==","shasum":"6aa0c2f96595298f3286aed4683d92ffe5cbb093","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190728074838.tgz","fileCount":238,"unpackedSize":4102139,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPVS9CRA9TVsSAnZWagAAHwcP/0Mozk9pqliz5mAvnTnV\naawjrKdnM0LNXp3WPLLny6MJ9B5p3HVuWdrrm7EpAV/QP1UAQIKXAGZRSOHS\n3cd5gCl01tCpj6Vhp6Gi1QKMc33NG6sWCmc+s7//pkLv6Yp4lyYIUFM1rTSR\ngNO/04eZe9mA9kBHqBg8TL4btNsuvmI6YZqT66J90XiWcM24OFRo8PKd73U0\n3dIJsRTLvFHzIqXAOgvnp4GAfI12nCqXOqU95FGPO8W7pmcH/l32VNfJP13o\nPq+3easYui3XfnwZH3hZpTXhyvpqAEXAQP/xDSYjqhYvKznNX9oo4VN4ic57\nRn6zxHGfcLQHcadRTicSR0wAZm9l+YEnjio0s4q9SGgmhwi3WNf2BnN/Davy\n2sEpOOtJykS2dACOL+9WxRzod5CBNA1he/daYcndTIrw2CcO91H8pcyHrfuN\neUGEd84sOiC1kK1b9SugP1z8hjtZQ6Dmf+5HjHAIZ7tZicU6VX/mBwCCG8vo\nbs/A1PnpziNwd4A614xj9JD3+ZsgB3o7iGItmjE+WQseV61/fpNUG+88QUer\nkoZ+g90VHeDSg13R3nygyYJj3OhrOE2KU3aBF1zdxekiRQKX7yJMdDPc/Gj3\nTK8zNFFfwMbcrk4zyehbNYxgVQzkoK4ea/qe25agc7M7qyYwPe/J0wTaz0Ub\nl1DL\r\n=TuZQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD2plQ84og02+hHkWI7DKdbbMY+Oygd4YYX4SWgB9Qp8QIhALTV2wtuePq4E5HKSY4Aj0nO/oJTVBjH0+gx6vHGgsmG"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190728074838_1564300477079_0.5155677163191394"},"_hasShrinkwrap":false},"0.1.22-master.20190728144049":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190728144049","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6daa34695bcfa7fbd57cbc80283cc546a2958624","_id":"@atomist/org-visualizer@0.1.22-master.20190728144049","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-pW6SvzrDQwTeHmrusel6Y0/f3eBlEgQFkF2vnnAIugQ+syDqpaQtz79VEo5yLvMYjZG/rDLe08Vve5iex+VB+w==","shasum":"67476dbe1312d5774eb3fced27ecba4aebca271d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190728144049.tgz","fileCount":238,"unpackedSize":4101097,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPbVLCRA9TVsSAnZWagAAvSUP/RBUNr31po8pTNC0OjQ6\nXdWzxT80dnkqQL4i1yomxoTH0cw7VzIwJZG93afcutRm9TkqIRDg7zCtPZ5J\nY+6WVbBM7QfWMa9VfyovNLuRxOjJm9ykxHsnOel+UQf28YFaYXp14EcAzGjO\ncGXkKEh6pQeOQ63g57NR6TGdWFL4+8Oe/bkREbjVJi3rr/p4yClFHynbxAYw\nz0fHn9dUQq+srOqK2P3VTlQ7LQIiAIWnFwD0DWZf0LeOS25VkAJaZgmDW7YF\n1BoGwHCaSUJ0609dv4Cm7JH6Ktw0uOUamMhO36IJKrjHmPGa+fi7DX/DTRwB\n2IfwzzqXtW6Q+8fcSjKDdwLwrSixoeeVQtqpyGcekH1P0Dd/wlEXv3XD+or+\n1Pp5UczJQEaU/FzwucIxLsP8c/tJ3PeN7I5WFHppOLGnCu49eWlupz/eTgAx\n52RC2MmgFXWhaYj6kLKzeuCa9jnzaYMHuuOqjahlhrt8CFMqH4HO4YXfATbw\n5HnG/elv9uy8FvvKevf5ZXSAEUGsq6UO4R8CV7HgdmbMSFOXK9iu7zHt0TCT\nSO8NEafC+tLnuInrmTcOgDFBbVIs+mx7HEv/bIc0YA/CAcJ3PnjoFxUf/4Ow\nCS4IVzyFsWyme2gm+fJeIQnbxBUBFdpYngoZSA/wLoAfirRTJPoCGXtt3E7H\nQaA0\r\n=2pWR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICbrZsDkIr9Mrv167Hn8ifv4Z0rgJJhXlHnc3sbHpAUIAiBpg/7qUmfBNiyd60FWtxkDFRv4pcB5PwX/mBUQrPXX4Q=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190728144049_1564325194259_0.14732833710817395"},"_hasShrinkwrap":false},"0.1.22-master.20190728211036":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190728211036","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2c0e70104133a050b1d810afd61d62305f0e0714","_id":"@atomist/org-visualizer@0.1.22-master.20190728211036","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-wwYSUnPJtHm2csBIHMb5AuOQMpqZ4Po6MP/mkODvzsK2VMrY+7npJoAcs0iQJ42i17Rii4rFjcdx6HdGZQ1yJg==","shasum":"a79dea476751cf45e3f1ac516fca791dcfb2367c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190728211036.tgz","fileCount":238,"unpackedSize":4103006,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPhDDCRA9TVsSAnZWagAAx/gP/R1y0ROaJzuMXGUyIJl8\nugYZbO2hYuxpC8y2pufVzUMKXEfefvXdoHEYx697Hf0kZWXOFZ9iNfDg1x1f\nOU7RMfoFc69ZxUj5ihTyoZXslzVE0y5e88mm58PJ9LWT6dLKMHfVpTjO2iCV\nuTcH9Y6/hv7TCWSbdk/9HNXZ7FhiUkhZIFk3bTZeOvPOgdqPXjbsRwtlx24o\nqUE/xvIYXXn/DRO1FnIvn8Qcf+yBKWoahHFn/AY8yWSWOYGiR9DOFJ9AZ+aL\nvpKaVlL7c0mv14Lqz2J1zNvFJaifnAtCbsIdfEvKYO+RNEwKif/xncOdCfhE\nV972gOWeLYMMFB9SasPSDmCpgK/orhKbmiV/Mby1jB4BxOAoyfW8LUno8uFW\nVyYgvlnzXOx4BkQALJdVUONZ3AOYJDTq/X39A5E+CnXfMviKx8VYRg6a/JLd\na/rn63wHohOz45A6zA14aOmaaBWQwL8JrdEF74qiQQP98VnJVnruUsS9cIz3\nEpxUXlc9gMHornKl2iMmw0F3uJHNK+QufNMC5QlfLaF8lZt4HgrpqgXkhc9J\nIUWuwfRqYKU8Fax1LDuNpHvv9iAWSLrQAZ7Kd9kTC1u/yHZasnlCS3UnwQe4\nPxSgid2sD0Ozxo4WNZjNKzapuUNdTMPp1XNjztT7OLxNkBs/8TXYnMGECgrn\nu0Wd\r\n=utLn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDn/GdJoDr8csiHJ+vP0gxDmwfc+RflLjSMVy8hMyfXLAIgEUkvJ9eZGNXCDhksy2qmz/I7BchUOUZMhjvaHzq4AaQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190728211036_1564348610156_0.9838186767630099"},"_hasShrinkwrap":false},"0.1.22-master.20190728215811":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190728215811","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1a1282216e647c9393d14786edec897ffb651fa9","_id":"@atomist/org-visualizer@0.1.22-master.20190728215811","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ipHopmSdXcvBuOGmoXKxjcDIw+FqOUg7y+tFC9jnpNwmzjrx6EdkOfdPJ6bWQCZQnVM+rQi3kcgwdHtAQcWaBw==","shasum":"d9f5be02e1e3f134415973c0984a3307e9368767","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190728215811.tgz","fileCount":238,"unpackedSize":4103122,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPhvgCRA9TVsSAnZWagAAARYP/RPQkYCV0mEYzCVge+UX\nnR5NfEuRJQgoKzKntnww9XgjPBcuJANuAtx62fOx4jiW1uRQTqETMIL2aSvl\nF7g6dD+jn4+uT5Fx7kfHPLac8ZVFU/+0MYjnXdW2D5wz9jUQOETH9Gw58dVb\nLSKtM6Mis7rQYSHZcvbj4gwmRRvSM/0kMwcJD55bCLkeFsKl/rpHimLpCJCP\nJTI5gwoztDLqY70BhDieZdNlo5XGyL2iLOI9td6qAdscBH/5Lx4QBrQIBhbL\nFHmawqSC/q4wFmttG1XPaU5kC19SwtocHsTSYxYbSPsNA++i39qqbi4d1ByK\ng/q9l0mOBPptTeGOzhUIzcmrqYe9ODN4RytIa9b2tUoh/F6+qxAwhLz/9S6u\n6EQQzrBKVroWNYqH9NXNMyi/wBV48Rz97uWDfWA13IlrXlD0L2iVCVvtrIo9\nkJLuLRzZ1QT2PzM4Hk/c1n0vK9pzqUjJFwoAWJkicFv/YVZ5qH05hbkCu4ne\n2HXo+cKmyC8TZs6uodmRcGiKBzA0iUH5jXi1+dP+QSBeLabfI49x16MIqj+z\noziPJ0BK/ERl/4lzoO4kUseYIoKdNUGfJ/PLc+DDrQl7jZ43ZCClti97YMP8\nTlSIL1m+qPL8r9diuV123M7i9BiXCKLgT/UjGRml3uNZBWW6VxdGKDLOCqDa\nGgNp\r\n=cVl/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHy1FQtnZ0YHWDYz3mah594YWhsr841XFBInUtxImeLcAiEAnPIvq0s5Wcy+54/9bu/oiSLYNQRRbWB7ixR5NECpgeE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190728215811_1564351455722_0.586373317307544"},"_hasShrinkwrap":false},"0.1.22-master.20190728220936":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190728220936","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1fd34fa2d8660f892d3f2f4e7b496fe8e708f58f","_id":"@atomist/org-visualizer@0.1.22-master.20190728220936","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-x13ezuAJHzTWhyq0W79lcIb/XSoksWDMm6PysEPbifXLVCOJtVdkCFQ9jsVY5DsHtfjg1r/AcxB129EdJkQcnw==","shasum":"dd7b0624b07113d038f488864dccb342fbd2761d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190728220936.tgz","fileCount":238,"unpackedSize":4099434,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPh6GCRA9TVsSAnZWagAAr1kP/js6mVgHcTKRAuByXRIQ\ntupIPzVbVJ9pfVqZdF/Uu30/R5qhbr+Bb5t9PIHqDPEZXGjMZwVc3Cp8Ov59\nSPNMkNOg0IrIkRBR8ZrF7RGGR4zfKI/zZuEy4fTkc/43tDMDUD9ecDmstDZk\n+azyhyLbNCrA5UffL6AlmO5s4nqKq5vPwt8nU+d96kQPXd1xDyQQz+wqjHoX\nxoxjz4ISdaM1kt+kCURHQ2anR075KBLI+cMd+C7ZqKg2/O0agHktv5WLs0Yf\nWT/O2p1uYYQRobunIU/hwBGrCIMFej/P23b+9u1TfRXtAP5uTh8htReI84WT\na8oM8BJQ4ZVOxl4a7Tt+fLuu/AyntS/VUdLLCgb5O+Bjjkug8lHJtq83Cia7\nZMRGcja4RJP7oMty8PMU3CF+s8XYbiHhIUGssW/ZE/WgQ5lTDMZ86thrg8Qh\nOabsQ/wYHP41vgzJcusRHtPpBakzq4vBGwK8xncvfsQwEdoCvMGDFnbf31gA\nPkiD5wstngpw1zH5gmsQNf8tECA0mgzFKUUDAPEcUXCASSAcQO2UhXazHI8I\n8kXyB5Ue/Z9vHrcWpA5PzGxVtBNOLvRB5pR57Y5oCCtBTNc25RqpyL1v+hl6\nBYpY2BwotLmlxWLKInxbCc/SneYrnAUYsls0zp+JXCFrCv8zc9iUvsn9HPwR\n8cAp\r\n=gjkK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE6wbthsjmzC6iPb/DAQT0vduS2bWeV9A5qyLLN3qPqeAiBebSOfI6VQ2BmXdkEwX6dBJgOlEogxVudxrPQzt20I8g=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190728220936_1564352133925_0.7280333583922736"},"_hasShrinkwrap":false},"0.1.22-master.20190728221441":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190728221441","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9207849ea9b90421d4001d97dc2ece7fcf566d3f","_id":"@atomist/org-visualizer@0.1.22-master.20190728221441","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-E8Tn6uI9Qqs3WsL5/L4BLAWJx52VhkmKe7nRBlN5lEK2un3KD+Kpb9tjQ3xubDUEuNZY7HwmlbbccFSGIuIcKA==","shasum":"5fa54a2fab638a2a6a034e1fae28112d4401ce12","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190728221441.tgz","fileCount":238,"unpackedSize":4099434,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPh+zCRA9TVsSAnZWagAA8q0QAJcQGnc23YDLHsRJojqY\nPcOqYY7ZZ/C9HEjNfgN+KeJiJiyO64l1C2gX4PC2GmE917QTmzaUNZzomSg/\nWgX5BYzB/IogDrqDswf0sPgdJMSt2YhbsYAngpM/ne8vUo/4gkLd4gYb7onD\nGymFROEKcwqLGidGpzXH3d5bY4uGaIwRcWjjkQmVYgsUkwE2lVBc3VKjW62j\nbuNcee9phNc888HzrQ+aVQbfsq0ncH4dS/3SeKFuutTTgkCVO6tRx8wd5zv/\nWfCN1FTaZteLixuVR17cfGGQPYyOa4t7zoxpGPd0iaywfDAxyrzDd6/gc45L\nHg1PFfrW0ti42bYhCVv7s3uDpKri5ky1MK4kpvBfLZfaA+8v3bqkbGhNha8I\nlRfYNHEM/gWF5D3RMNMbYPptr0ZIepIYuviROYQBhRW7oVwsrqAJbUxleRG1\nD5RItKfDCht9D56+o+hE+bbvhgPd6blmXLtzvSuum8QRtqW9Z5MyrbAxDr4V\n1HcoHUmGAF8pOSFjNHrDHOpC3/K2pkH3IzVq90+8YdMooKcyEa2/6vEuDOy6\nXtxMlFvtEBtE+IVzAGeaVIiCyOEvmjQKvqyjDGIQrLt9GZBnxa+zSFll2/5n\nugVn7le6rfCe9EhFOQxbmV2PVQyUVc3VF+drqN3w5tRrmk43zQvQVnh6tQUT\nkL0A\r\n=8exJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEEq/3JsDQ9VhL/hxPeJIE021wTfRSV5bZvtr7DXTpBiAiEAz7NYYZRfzFSL6PArTdwLDPYCapD+Iuly4nrFU/F9FHA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190728221441_1564352434644_0.6380336191128948"},"_hasShrinkwrap":false},"0.1.22-master.20190728223658":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190728223658","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4446d15c6ed9642bc0f129c61f9e562745fed671","_id":"@atomist/org-visualizer@0.1.22-master.20190728223658","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-kUvY2JQMxFLGQhT0jYBafVxyYxLZieJRtvMyL89LfanmL3kn6fimiwGgfGxL7x/JS9jkR5k8WWNpqYYPGDhAMA==","shasum":"e6bed698045055efc785ad5df738246f48f52eb4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190728223658.tgz","fileCount":238,"unpackedSize":4100340,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPiUFCRA9TVsSAnZWagAAgNYQAIR6Yj3jg8egN9rAyHus\nqN3RCZ/lR+qWiIIXVc5ljj24oIjuTijUToxohYvNuvRnrrGG8OS13ulgV6/s\nyG10AQUZc6x3/1MylQgPsTJvXuYmk9faHW/B60wf58M3NbAGHlL8zOGa25Ei\npzZfT5/uDjZYKnOHVurT1GCef64JW+szlORRNTq85qVCly0CZQFDck9gyPf4\nb4om/fRUZUxJmzUoegyVusSuhqu0yn6nBRdpLTV44N6G8ZpH0CuKmp5S7geB\nx4JWXS2FEN9uGrHQNc+KLm4AsMQqMjMsOD6s7uQZsJvKVwszbF807dnWey8t\nWZx79v+oXIo2Yxfr+4F/nD01yAvYExvv/x5yTh0GmvkXOv58sP9Mjk7Nthrs\nDiU15OUhjz73PFx2t7mxp5WVfwTDh4HIeh7OB6Nzqy9fbNCmlj40BbM8wuxl\nLKPKGxVgMI64Dlu/vae7osqWgTHPNwECouy0wSllzGTlHb3pWTnDlTBh0gIH\nSVz+svpDQv5fvXsedaiEU5VpmzX76bjhH/byeaAmU6jL1VwgqCbq+SMHYLMs\nBqGpiT8/t3DWFvE297lIP/4WchyuQWkFqeNIPj3Hx5oYBG34WlFNNoQjOehC\n0TaMgrBSSAXpLcNfxRrsVLq1FL5ti98aolkGeGU7kwigt4ATzIvqO1NTzy5x\nLUs0\r\n=NyHx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICwscOdCq0vPEPzTo8c9qkxVmiBndprmJoOzEN864pQHAiEA4attbBRVRh9awFIoebdewxZ+XYBhjor91mJ+uitxsnM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190728223658_1564353796271_0.7756043793852696"},"_hasShrinkwrap":false},"0.1.22-master.20190728233446":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190728233446","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6e35e25a1ecdebd92a6c4276be38bd000f272760","_id":"@atomist/org-visualizer@0.1.22-master.20190728233446","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-RUFhA7D31ikLRky5hY/17cFcTaVCNVleEmy8C7Dco1YMMzHbB+7j1wTeQyJtCvztZXYpGDKEb4vprnmmP+6aaw==","shasum":"a308000bfdf002797689043ccd0150842cc5bdcb","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190728233446.tgz","fileCount":238,"unpackedSize":4100288,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPjJ1CRA9TVsSAnZWagAAu9UP/2uHqIjaurdYmFY0yD8R\nVsDIkaqnJoKzhrW9CDMPPypzlcFkvxKO2FV0+P+KiZYQgoiJrLc1wzBM7HSF\nbBz3T4eHFnZdok+aoE8RjobBd3m9lhqx4TDOQOOjlZBleB1o6+D7v13GZUG+\nMLsbVEdn+mrG/EEVxaYAeGEH39RMQBZfP2mjuhbC86aYYigM2O9+NCg6pLWI\nu5maGLg7C10H37vMf8+YJLRo+2zzGBiPqt0H23JpCzW3j9uPPGSGWG2lKrtA\nAyCqBBp8SBB38T7fwDLB2po3X8Ew8LM/mD6Akhalk6cI8+yd0e2uOPWTka3V\naARntmV7Mf0/fy0hD1L1C/8+IFwc4+HtGnGyc55DYYEUQNrV5/M4OA8pCIoj\n4MEmWlJ6Hv8Sq4NZFUJ28uyZ+wy5jR3qgb6c0+Sh6lcLtD2quPDi4132BJXt\nZz+gLemvPcRX5qpTxCAxQyguV59yQkvx0AWakWP/bw3YNdfMLKRClRlUXl4p\nh/+fJIo2wv+1c16jphPuRJKzQ9CdGHSeRyc/aNiCtIWCxl+gEyRG+vosIwLC\nMbpQx4uYom3nSSxIgzFXTEPPL/HVost9quuKQLFzVH+wv3K2LR93u8pZZ9QB\nty0ThhPeZ3EXBgPEjCRUJaAK3uZBTtwiewGLrpkWgk6wziJNDddneCd0sNRk\nxwmn\r\n=sD8x\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDoCtNF2vGX4wizUWNXGkx7NGcCcV4YyzhuyLD+E6i8rAIhAL5C1j7ILUqJCKSJvUUp94yqd9fQJ3yPCqDJd05W1ZZ5"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190728233446_1564357236219_0.1408573734017775"},"_hasShrinkwrap":false},"0.1.22-master.20190729085555":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190729085555","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a477f1231cbe4335a18fe20f83be9e0ced5d55f5","_id":"@atomist/org-visualizer@0.1.22-master.20190729085555","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Ml6MhtA8X6IcxFpVh9mZ6kCFP24IZrkWTIUMv5xegAhbpU8TMdO9K1dmwFHIf0CiGClVWswdJx/h01/TAH8MgA==","shasum":"ad591373778918127872c4424c60188b440c7f22","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190729085555.tgz","fileCount":238,"unpackedSize":4101228,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPrYECRA9TVsSAnZWagAAh5IP/RaIw3i8URheWt6lN/og\nfhUDSdoaeSf9h3W3iAQ53ell+PiFxnhZYkmYTBNCI6u4M8sQ/98MA/tH5704\ntEv67JGx7084oidSbaeT8bc4UuMyTBvqZn/c81giEAhnPNae+S390/KZgC7y\nHwa2i1YsoxFPb2rlDj8SPzNZf+p8j6v33Fbg3dIUzt2r+0N+9Ia+4djdRB70\nJrGBkEudm5klpQQXY7kjNdOIXx6vEeVy1kwO9hnQfwNIEGlJhCWAQfqzhERw\nLubQ1a6dimRlrweM2Xtroy84Xc1BEQ6tOj3IulmD0Y1d6MONI09dus3gTYsk\nWGlYfkz9X7MtOCpdZvQgbarNsdRWYnZyBx6pixDeBMk4ZhDKXnRrzvWYaix3\nPNpN6LmtrKCLE0gLXbXy7TmvGThGygv8vMcfYrN3PW6t6fACJChnCJNhATh4\nOYw243nEnbf2Okoo2Sz86Q3v748cm19IRV8fGMgNhtyiqx3r5LeeX42JZDSj\n/Qf2xW9HwItIMtSyn8piJnRAcVvTuyXtQbsfJEuVGKn/Muz3avekzW6kkqhp\nsp1ng2lU34vF19eJogyXfZejp79eDTEAODGWABeqGsmJ1yxYoC9/xcINXIac\nsKsmAIdnAYSoNXDjccYCC9aUaEDC0SCebJ3NoTTzY4hmQTQL1Z31EkARhtI8\nHv76\r\n=wwfn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCuY68JIFQ0NRq1qGSQm49jM4rm8ZQvz36V2QrR2kg77AIhAM3djF9A0RLDXJE8jyME9oB39GJxP76/F9g+a6w6CYpK"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190729085555_1564390915901_0.5233966247436008"},"_hasShrinkwrap":false},"0.1.22-master.20190729091410":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190729091410","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d95a7f5015bf00a10a312f8cf1b9746e8e5a55b4","_id":"@atomist/org-visualizer@0.1.22-master.20190729091410","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-shpZh/GyyfWajjutHgvkJ+eXdz4eWT10iprdOZBsocfNFWXBvhLCD3OFD5j13zIkaIu46QlxSUSAW/pV3YvrxQ==","shasum":"94afe6faf9c654e1983101cafaa5ce79aa88f5be","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190729091410.tgz","fileCount":238,"unpackedSize":4101211,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdPrpPCRA9TVsSAnZWagAArSAP+wQYCzGwGnS8NhxZNNtH\nNxLH1cOJZ+1Ijayb8hcCDEBPPoDjCezYeKH21KvRoXzpZgOph/DrfbasH1e/\nHplRXcEYONlbQ/cI2VvyCfpAGGfUeYKQYO17924GAIk/H9lSmXk1l71t0gww\nBY6tn50frsdw7smXeKPtaPJvMSQrtXMSiz8Abtbf9QhYRk/2boEJFUDumx3R\nb9r5KfE1nY6tAd44v3LXFN+jc9N8+i2ymRoOFJYSrNyZ3AIlAI0JGEC6xE0s\nQPdPHDjaModC2wP7rvUYV+Vsu45AamOhpWJm84MR9s+rzUNMEMqBKgY7N76d\nJbNfNgbgj9qJYnYyO5QfnZgZJ4rO2buE9xQshhcZPDzq7sCCQEUytkR3UfZP\nXkUy7cwu5jAYn8OSRrswFQ9xAcpNZYig1HxY4g6jcAQ5e7JRintXFR8quWoE\ntxfgKZiUwPLPkc15zH2spgeHxMZtfJ468W4OvaHqR7pGmpjiVd3c8SiBSLFp\nWZSo0EoCN9YwP9FvyHper0/fx89TROubFGilWSC2EgDOtmH0gF4AM1tapJqw\neequ/Qk40v4I+63RYrKqZSwwhwY5M6JdYj1hpm8u0+Ri09n6LfxzANUQOqHo\nqqnG6OKeUO5lVBRNotkORrRzHKLxHk51GRxLCAQUweKc5NtHRa+U81oTUTrX\nBgsf\r\n=efMe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBCWnh0U3wmZc/MTsDMOs/tW5q9b6lD6Iw4dmR4qNFU0AiATNjAq0LRsZzdYIaYecFurpF7LEbOILVg8iXsRUksDRA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190729091410_1564392014960_0.9452514894246127"},"_hasShrinkwrap":false},"0.1.22-master.20190729190730":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190729190730","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f16eb618b13faf04376269246922a50026b24fa6","_id":"@atomist/org-visualizer@0.1.22-master.20190729190730","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Gvzs8l5A6FYuYC4fts9uux1laXvyEQUiJzLinyIAQabNE97wi9q7wAAc7nOye058xqdnwwoeIy4vb60dvYp+dQ==","shasum":"7573019054ba3dc20f663fe0416db27d05af8cee","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190729190730.tgz","fileCount":238,"unpackedSize":4104982,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdP0SyCRA9TVsSAnZWagAASQMP/2TA5o+7r3WWzdLl1Bw9\nDLEFlbPnD2Bja6szblF7lLksax8pQ8zAb5EgP9X7vYmGoGM9Yg6YzXoOglFd\nm8npxGI44KuAphxnmT6GeaGAEEM3gmEDpWQAR6g4tNG4/gloLZLn2yjPmqcG\nPPXGqOmfO5XgRPA/EH/4SMnltZ1k8tQxbnwquQ61z9VZn39Sin2uzOx/ACDD\nUriRzkCL5WinahlffarQNiJmXerVEeo5rMPdPi89Y/rc+Yw/yoCEdpjxTEl8\nt8oK4CVbK9nOzb95HNISVrR8wu8oSLmYg6hKZKse0GUU7jYtBGJgPUg9hh3+\nNCmnHLE3UXo8PL3AnWaDkXEuM+LyxQJIESSazl/X6NtRJ6xAKTB016e2RkEa\n5LRJKchTwFcgsXi2b2kg5LGDgSVg6o8dKfUwsaTTXwZbFdaWLkoHMt7zDqfO\ncgchcktLqjjgxL1Ykou02EfmWTIc50dGGSSmhhLL6IJJfm0nxlby9k/6M6xC\nZ7JWQzJ4Q+smlEmmHqLH2mHmtR5DUrnboGh4lvP3qPZxIo2Xxm8k5MREAqTi\nW4aFuVZykQ8Q3DQR9ejBy+MFjfAloqLtGqHjN6yRZk1WbhQA7S/mJWhmXsjC\nUZfl8Jgw31TGD/laoi8PZaDDIS3yJNPAZT0h6H48udP0TwKNSW4o/nWyhSf2\nrsE0\r\n=i0TR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDySdZPOUF6GDIKHG6BgMD4C+k7avT4uwEozujZYm49pgIgMGQ4pRVoHLAqCkv4i/gd/BGVPOICwTzlT7yCIMPYZnQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190729190730_1564427440667_0.3655672687492877"},"_hasShrinkwrap":false},"0.1.22-master.20190729202621":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190729202621","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4b559f70eb0ca8778190c7ce9735f12d3e8dc48b","_id":"@atomist/org-visualizer@0.1.22-master.20190729202621","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-5t+zMtLhBg5pbsXMC7kEfECKKcjpI7HlaaJDwslXw4u2CyaenvJSoboT8l4+F+dYY20Q1HTPRIm8m66G33YRWA==","shasum":"7fcd507f29db0cee2cbcc5488783732031408360","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190729202621.tgz","fileCount":238,"unpackedSize":4105277,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdP1c9CRA9TVsSAnZWagAApNIP/jy9YNjabVkFPB1VIGi0\n7cvYItbxSzvz074LJJT+DulQQveeWFtQuY7OyVU2x3h3kazEAhVFSdlUtP10\n57ocUP3KBcdEZj88NalXaV3ttOyViL7KAGEt5RgXEc8Y0OdPWzJ0J/vaEc2V\nQTbW8pcCVOyPYpweqENv9JPqKkZjZUHmp0wVzGlI5SLx9ZCXpkcjzdcRssnW\nMH+XJ+A+XH6w/2SughFteqJT6RW5/CdHwgUWSghN+cguEy4pDoodWRNh/2eh\nDeZRqu8YTBrGB0WHB6YLR2UIRKp18TtmkMygGX32jEd4DaEeLIVE1/US01ju\nJN5vQgc9lyNfDhJgTwcWTQbJiDG8rYcDFNKsgCLvjIKZtvPBKqpgSDMEMyys\nxShiyjg8O2v5ODYg5IaICkpkUYlYCn+SWKo46QJp/mias1pxbBu05eySgFyN\n3fHk3QVtmblUofh236mJQytdRpRIk7b2owJg7/RDbc7t0Po5x6ycKy0E1dFR\nYXgbJdpzIshCsnrMOHBWfJX5kMDYrEzmrU3tx56eGfAOVGfLxjpm3Zd0dal/\nis8wPZdyuZD/lhjaVH/lACzPlg1nEiBRhwCjX2YTOOLH/bPG9oJDEeBAUKY9\n4pwSh4CmJzV6sNcdRr+3U2qRXx7C4YzH3SQEgPlXR8O27Ax9iuKk4Ohb2ntE\n+TMg\r\n=2aZJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/9IGoh2QhSmbcDcvyob3NIwj2YAlWPz5cbWN+oK+zigIgYEAwNJX7UySeUeuyoGMCYTUc9dvvts2zMtn9zo+KrHk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190729202621_1564432188959_0.5284021292661782"},"_hasShrinkwrap":false},"0.1.22-master.20190729204609":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190729204609","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"643de97ceca9c5782ed82d0ae08a4ea6d21b6f31","_id":"@atomist/org-visualizer@0.1.22-master.20190729204609","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-fLbFYwtvoroueKn3tVfHxHuhz4D7qOVy8knZCsY9OmR8ye/7pPr/oD/UISVRNkBYQrO1I435BCvE/MRpXAbH2A==","shasum":"d65221f2f955590be2be154c51a6f31e2351f993","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190729204609.tgz","fileCount":238,"unpackedSize":4104681,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdP1vLCRA9TVsSAnZWagAAYvEP/2+NbygICBETIRAUHtvX\nX6ShiwxcnhrJun+I6sJDPIXo2DmvDey7G/94yuomd9rPvHhrqsjHc9d0g4It\nO30aHW5znKj73ELkoVHlJpL0n6cNGbZihLteQMZA1agR2WvmTG4wkmzgNHPc\nO2gdPRltZMrMW6rexk70cD3uInFt1WRdwE0Mdofq9WEntMKgkIwISdlou31l\n7y5FlCFTeHkZrZCZr8RIPm8nTyC76NEeMHp+jF/R4DffbSVK7hmBd2LGvl9Q\nQ/I/BYX6Pe17HDsG/wx4bdV8v8i3cYXiKlaLyzT5m3A4jqV9ymP8z4tehPcz\njWY1PHD1JLSO14At+s5sKSUQHv6Ao2KLYXPCUJPJdtj7IgA59gnltu8/Hygp\n2QX3w5m5bHvidKBaZxycAWP5sgtyDc+3o4FEEk2ZGziOhiY2/bq68+IbJ65R\nGNoOjM7pJXvLyvEHeRd7nR+m4+xEEScwZuC+pQyH/rk/0bfe74zOKolxacOk\nFloWSXSceVTJXg0pm2kHx6AKWJ//xrRDfVvbUc2MZf4Lcx/TK41ErXU+AGd3\nE0UAzO254e7nUhubM9l6R3sEuzi9w1AAMqF471SE0Lx/9puO+AxJ1DT5OwC1\noLwrZBrng/GBkywBjXWIItj7Fk5eyx/3uSz4+XvhaXD707HIx/Rq2qQKGEKG\nGAE4\r\n=ADLh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICwSlzaMk0Pf9B4GFFyRgvk8JhpSkzSK079D0GCxffevAiBgRqGMY/qOGuDvjDKtAW7eCbCIrWaV6zosGMAwEFpFaA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190729204609_1564433354577_0.057200793310252074"},"_hasShrinkwrap":false},"0.1.22-master.20190729214253":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190729214253","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f7015a7fce337f09eb46eb9ffdab0adb83921b50","_id":"@atomist/org-visualizer@0.1.22-master.20190729214253","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-5Rwb7AMwNMQ4TMg2+iTOHxAKxIBXGKw58Z9p15mjd4W0mHfYjmjM9szVD/gvcKP71oqfnpz0l25RMLQJLfje8g==","shasum":"788d9bcbce54490a9cfffe7738795c83a1f74ba1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190729214253.tgz","fileCount":238,"unpackedSize":4103684,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdP2lCCRA9TVsSAnZWagAAJZsQAJFQhJHSRVGC2HU5CMrE\nxSjX3xR0iXuMOmJmYEY4EVjOIOUDYqWOhsjIZKs9rxqVkg1Ek4XFs0FfiZkl\nFp31QXvkBxa1ScqAOppxz0zCS7GRS9jHsKLvo/2fGPNQ3aULsyWyM8YIYM8j\n7/Ck9dPLVsNlI1T8dNTM7oFkTkmP709iDbsSvDxzhqdqWAs2JMf+NDuafUE+\nhZAMjgmEsN1vZ95gGDAJj6NGZEoACEoeJhWYY5tLGDHrPuRyxfMUepcnssTP\nrry4XhqxL0a2o9hyMiavupXFGEOVz+wg3f98p8gmxk2vBKF9sLbmIHKNArmS\nMbMFxGx7dnGiJ9U5c3SngXJ7oeiZjwbdIN0UvNAe8NUiWxu3xncHVm57IUnp\ndWIvKhKz5KFiJaYFMm0V2yMsBkwfq7ottA0HTjCcHkG4Z6mUoqycNlTngp2Q\n7e1KnQyawTiO9C/eWV6xpoFtX2rblSAgDADyhX0xVAkn1tBWibVSZzqrb5AK\nKxsYXeOgMhWVis6T8jOXsYLPV0GNcLS5CDZ1shgYbCR8yarnQOK656/meCn+\nGSo/afvvolrZBeMr5HGfRVPW/gEN/QGrktZ+Oz72Q9mFLtIcNywpXLdf6a3h\ne6GX9JAefy5+2GqbBbiM6/FXMIXP4S/F1CqDxOHSNsGlikdkE+F8XZA9WsYc\no9/V\r\n=ytWw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGXQTmiIAxh7ViZxVUpshHeRH8xmE1+8rW2wtXYN6JZgAiBxd9jgfo+oKqbTf1f1oxeX8iOP90kaLkoEceuTv3r6Eg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190729214253_1564436801826_0.25989983260309635"},"_hasShrinkwrap":false},"0.1.22-master.20190730011248":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730011248","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"dad80072df36861f0fb76d5554ba52c669b0afa4","_id":"@atomist/org-visualizer@0.1.22-master.20190730011248","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-IuDvNJf2pWys/DnQCNGGo2QOL3r8552jkg/ZcklsHmAj34idyuVbiGWXyIi0BpqlahCflzk03PNNiw/xDbSpyQ==","shasum":"6e988232d7eeb136b7d5a11ec5a7a0bc073423d9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730011248.tgz","fileCount":238,"unpackedSize":4101182,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdP5rbCRA9TVsSAnZWagAA0zgQAIu/oaaIAYSSxJX5FhPU\nZkrhcikYoqwQiDpuaynwrjhzXBS3uw//z/ijtDK1kJ90WMajUSQ1D5IHMWhX\nx42VYs0vWD+ICTHY/tYnEw3W9BQb8yVjzjNG3ILsu8S095Luh/nf67ugtocE\nKFfu4Z86sGlSd5TmFTZocu39tTnZtyJyXZTL1SrQ4ZFtTgCXAJWh4BfQE/cE\nZy0PkZLh9u09Bn/QQNPg7fE/Glscmy0a3yDJ8g6ml2QHTcM8z7EVOsbkPpaF\nFtUyrt5WhUSSoQh3gKkFRAWbH6sshI7u63TVxD9V6xuE/+NkGFoRw7W8SbBb\nHRSyF5/NUtQN+SyvMZ4z40Z+N6YKeunWNDeu5CsjdNUDU/GHOpX5Cs+PnrRv\nGlM9lPrE3ooPyL9HGUfwM1ZHzRyB6dvxg9tEi4LYCq/LHk6DLzO1NUgCIqTM\nCANw6j2PVADp+w9UZMV8hpR90sci3F9MkPSycqUmJkWsVr36wghaMWli0aRc\n8ZOR3fjLvtQ/Pt5a5yxSdQiPLcLsKdLY6zyB7O7iMkht5TX8THHuqwivFAOW\nf17XAos9rYfzetBWChElMoMG5vQpxmZOGJSW2nXs/phNuqMfdA4mQmkp+CK7\n6S/sZ/cyOdBRRAGKYCsx+rf17At3HtAk++s6h0w8zi/dvq/M9cpCe5aNVtrz\n8nkV\r\n=2TsR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH4c5WdrcNE6wFqrXfyeMaysg/bywgcjCc0r8RoNo4U6AiEAp3WqV6bEJieJ7kL6iIs+/Emdj2gT3lr0ExpfB8ftEnU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730011248_1564449498889_0.7240990001969221"},"_hasShrinkwrap":false},"0.1.22-master.20190730012736":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730012736","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190726075222","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2e5a01921293af74a6f76956302e556e7baf2383","_id":"@atomist/org-visualizer@0.1.22-master.20190730012736","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-YDWA0jndU9d8QMShnlAIb7ywJPVXS/6kmjJd6VaIEkoJew8by4i7J1705SBLHbBOTPxa71Roo2yALM2kAAqNmA==","shasum":"2da8495c17cdb667eecef3f97086f1ba8fa1c8c5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730012736.tgz","fileCount":241,"unpackedSize":4102556,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdP55VCRA9TVsSAnZWagAAbSoQAJdm3ocf9STzRCNYui49\n44kct1pFLReOESOPyG28CHEiX676ley860SlrRoNilzpYcyBwDg/uQg+TK5v\nQoPwFiYSwJO8GWub2/S02NCmqTQ6fE+9i9nT8J0FIyAQ8Uk9FuRvGmVPQfP9\nnyymu8Ks4MNoJm5lwyyU8GWdY/xwCI3uPB8t+BL0lJAce0y/7BL3DViNRIdC\ntCL7xvQs60zTwl5l7RAPmeNWk99lJzo8lym6NickHGIZlPwt2Ru1em05EqW8\nFAiaQOc+zJToQg2961r+p0WWhLpYJmSdKkYytIEz3YTHjbZaUCzfcMzMVeyd\nAsR687ei/hHdshK3sPqJCZDc91uMHJ4nKDKhxdyUDst5prLl8U2Oww3dJ/FJ\nrypjH85BI8JbRw48AE/1/VOkgKvO4kK2dt7HtNPGzsFaQ9NkYZxCO/G6RC0n\n/YuKeZPhxPkYs1PNsbQR21eEAu3198Xw8EnWBTs1hdtQUETWgVs4JxDKBkm6\n7wuUwGXcPLFbxYxV58g7568FjqutX8XmebB4O1HQPnJSB0FOSgbOxDW64V6W\n8ML928Mo/cI5IFlBbtWn+Ydu+0DLzen+aFYH2GUHbSozbU6dXdVlk25/M1KH\ncpndnEEi1zfFmPfx9Qcj4mRuHBCqRrH/T12xO6Q9Exco+30MkL3QcmzErkIT\nH9Cr\r\n=ZHNn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEzrnsLJjiNrBQq7mSAr75QIZ9DFdumF80sl6ZJmlFECAiANYxYDQGzbJZWmJpdj9/jYAIVwfHurCYqX/EQFeqNEaQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730012736_1564450388504_0.3438073693607959"},"_hasShrinkwrap":false},"0.1.22-master.20190730090510":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730090510","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"439e0c5e6d2041e1b17ea56a5fc04005d624d67e","_id":"@atomist/org-visualizer@0.1.22-master.20190730090510","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-CM0X5VrGJM56w/VTMi8ekJv9IYIc63KGYlNvymu0z6NmU+WwoYqjlmKoMowysJOSM6xo0LROd42JgBMwZ+Frdw==","shasum":"8bb6b902aa540de41f090f672c1070c0bc21b07a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730090510.tgz","fileCount":244,"unpackedSize":4112677,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQAkkCRA9TVsSAnZWagAAwisP/2YyJ6HmYXVO0hqFDTf0\nAUZSMm6UajBJyd4t5bO06wM/RCTmtqRVj+8xqPacofFq3fa/6057OnRpQtxj\ndeqgJOC2EwOI7ZkdZYyTetLK/NH/Yw2HOR76yw7igrEOTXoUZ3GhoCXam8po\nFRrRHUJbH7Zxp5fpI9ajH9lIZLfu1JzywhKwRfqcBifZAjARUyGG8rcDgyDH\nswxZE4lKGXhIvLC2qeS7KNXolcWUlDH067hDbxaCNrtNCTXM4RU7ApVzNs0f\nXMDDmzaNCJfcW34dON5ycOIjc/lKZxvTAzVbaVqy+xPuRMnHEWgzf3uEyYPg\nf1MWb/mt3IRGzRlkBl/saeBd1HpRMmvPhvGHt07+yRvXz7jJzWyfCfxDxOSf\njvT4KGkXmT+zHDqmGBl2K52QeQM9fcI3XzN0l6RN+ylRu3EmHHCAnWHji8Ua\n3tPqL8Kfj1m3/5pPzs/rQYSOh6XM12SYfkLEKbBpWl5frfeCcHYGCSXAzwHI\nX9mjw/Mb7fQB0iHEgMOWA60JTPGHut2guoyqUDmhLChrzxKRDs+G+oocuOYN\nIcyTYP9heQirI3ZWjCDXJ2PoQr4p8eEaXvcrI7Uejq3PYrbWEMC7yxKUvNcd\nNndXhGPw1cZ+Bz+nry04oF/4Ob+UnRTSBoC6yo8mIG3rKpzdlIlliYCYa+HF\nVLj5\r\n=LhTj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDYo+tE5BAoQKbrrCDCofnsm+ycEZJkHpOi4PrBCsEplQIhAN75WboM3secnqIH1nqxd6R+IG0Pe5MLm5K/dASiPRb9"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730090510_1564477731326_0.8278411719918923"},"_hasShrinkwrap":false},"0.1.22-master.20190730092009":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730092009","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"343a27f12af569ce93e7e25375e3623948f164fe","_id":"@atomist/org-visualizer@0.1.22-master.20190730092009","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Go3iOSCd7qjxwp5HcCvs20QeK+uyuxFOmvxRau0HaA4B6LiUQnl+Zwjxon6XJSxvTo2SHS2Tispjmq+2hcOP9w==","shasum":"8e92158a7dfc13ddf67f344d49ef3237acf9e3d1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730092009.tgz","fileCount":244,"unpackedSize":4112710,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQAz+CRA9TVsSAnZWagAAP28P/1XXibR19g2Djwy+SDMs\nLGseVVYL/5OnjH/NyMQP59rBBnQLHLxNpb5UKNzLLJ3o4lolj1x/MwwQahfV\nTfjli0pMNuEVsjwk/gxErO80d4i7pLlfRj98ksPSlHGzoUizKxSVBCOmgOC9\nb4+AC5So8XKzeNJmcZ3382vZEXCbEb+u+OrIBZUHNweajVOkySgDchacpgby\nCT1Eyq+fZu8OR8HQbr/f/aiKAG0T3WinFAVmlqW8STn+K8P6Gef+VQJfe3U9\nyPhqrhPGl8uUpVfWEHbgPQG2Spo17tFWkW1MoA5qGSftIuq+SPumuW+jvMHn\ne1rTH6R/Kcf/AuB9fY0GjAz3IjtDUBFwBFCfbesz0+UDn/mAulJJSUkJrXuF\ngeoQ9yf42Cgq+8CiinYqHN1Mqu6MM/cDjVDEaYkQ4tn1rRHGOKlyD7dr6hWW\nbGVw1iHor66Nm3dh2N9OE7vEDU83ZX2/dcTktCKcRZVhJN8PGh5hjGUdUoUK\nof8KqSljgsLbpqaKBB4HDz+tE8BYwn8LcJ9Bwq0aYYd+A413I1VN8A6WSPcr\nzDUuyztUmj3+XpSfPjuzIc0rlXzOlvT7vP9Kown8BTYN62YfpTetPmGy6Oo6\nftu7UHu2wWNSF6RiYphzEgGgk5fFdKA7mHFb1z0f6pGlODUUFW+490M2MlcE\noMIo\r\n=7qxJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCN43h6TNIId92+29BsBxMRR70zB9kuhUiYOq9BdUSOrwIgCeamkZzp1EjqKnNzzzjTkAJriYn4BM8IL5BWBk+fdyg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730092009_1564478717836_0.20309143197239599"},"_hasShrinkwrap":false},"0.1.22-master.20190730095030":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730095030","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c848bbc2a4be696638f26ecfac733e93c0f5400e","_id":"@atomist/org-visualizer@0.1.22-master.20190730095030","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-QK4KrsDnL182axloGtYo7Ishuy1A3jZzHOCqwHzioXcmTsj1zTZ7QNnXdGm6QEofS5FIHZcGDU0DtsPdElULSw==","shasum":"c69b8cf344dec79bdb402d7f77a43b79ab88a1f5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730095030.tgz","fileCount":244,"unpackedSize":4112912,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQBQsCRA9TVsSAnZWagAAPusP/1buMhBppBkeTejFko4n\nPyXCvk5t1HIXhDbLTTSFQ+P2gAMltPOwNWRkIMSIdex0f8MUIJyQOVldGxRJ\n5cmJUrpI+BPzgdo5qnPFORPEPWi7lfDLWqcKTGNg2w1WvuVS4KC6yFcO9LZJ\nMumfnNVMwP8QfQ913lcWUGOM7OxRtsVaGnzcuKmKGRM+qacDECxlBXw95HHr\n0xBmc9xjuJCuid6lL9a9We5aIErqY77TdzJ1AqSWCeWMPTDsiQ/bL2bDOdKb\nzuH+/n9pakoo79hAP5HilYeRlMOB9SnYxz8HcfILglEq1ra3wrxJ96Mrq29Z\nzpzR61Vdsz03NbNL2Et09+mhT2jJxka5O4sS1dpQNwTLQE7sXVZK0+R8OXyH\nrKno5r5nVO8lbofGxnNzVORpcQ1KDY5LAFJGlaXD4KbI82vEC3altVI12Nv1\nOh7UELOCC7Mcn8Czm/VkSP569YaqWcwuEPOsMwEymQYxFMJlsRLNnYRkW3OU\neoHd8dUFiz1OOABp7rv/pnDeOx/EQTc0gWrzAqwvOxdtcq3ra6YPM9XujXhz\nTkpzucdU8+MvMdKfFZ1SxAESX6izpdKXsFLV7cBWyHevl+Ir8nCB+ymFU4F9\ncw/x6Z1PveWO5HggNaHA42+O1enAB91nWPptvLiLuKCgh72BQ/ON94MACjfU\nvti6\r\n=TS4V\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHI92hsK1k132TSyYpLzsM7UeN+ZAKct9fyWEfljftJvAiBj521LEngn2zaAwLmTN49EJOoHtam193MrsuRohSIS8A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730095030_1564480555947_0.9147854206945953"},"_hasShrinkwrap":false},"0.1.22-master.20190730102641":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730102641","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"aa0170eaa462ba2b1256f55ce76ea7dd382f8520","_id":"@atomist/org-visualizer@0.1.22-master.20190730102641","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-PmtEIVwFeWycL9nuS20WjcQem5ZJW8xs/iRfaAZRlZ03wpawYytthN5vrCMFDM0xi7101tTMx4fZHZRSARGQLQ==","shasum":"40782f8bde05e33f03cd5e4c7c4a3a8280d13da1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730102641.tgz","fileCount":244,"unpackedSize":4113287,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQByWCRA9TVsSAnZWagAABR4QAIwSlaGK2zobMmu0fDC9\ngH2SKOxtQ/vdnjmCZ33Z5/0tKT/sjql0VYl4bFdFnSEexihg7PtubguNmvZB\nVTh6j/6hY4lfJ7fk9lTyAPlcVNkHjXtAdCjYXgsw1t5sl7VNUuLUatbfR+sv\nAaRXyQj6Ys5FyMk1H7PzUPgzKFC1wENTdkjSVvhWx/eQgvn8yvqubPzzMAxE\nxfrjBYGCc7wDl2C2SzQrOeT5ka/mubGJtu49z2UqyMQMzwemUhHEDKrGXWmW\nqSQFz98xXUge86OO45a6C3UYxWtpvJi5KhvdzC1ixaat8/Dgf7yFm5lSNL7x\nIMKz3Cav1S5ko8HyJQMivH9DcHUn5jNtKm6fc6t69U5x0xvWY/deZ5TpmMvo\nPjpsaE7XQr8rDiye9fMBKar0T6nEPUsvMsmdgoFgHrD/FN34juwwZS3kqD5l\nelJgoocCi4+E6WNHydyRZHkFeDXVSai4Eeooaq6Np+LrNnRP1WpkHpwp3cDU\n9VJj9mZ79EXbR72brd5wt3fMX3ZtVLaqHf5ZNu9fd2yMd4PsYXaYXjz48Gmf\n3TbYL/52aTA+fNcLn4iJ7NnWXPqxSzSmcqL9nzYrLmMae2KYKDnDLSWts4fF\nx8MEpHU6eCmYEoHLKVaxjFaX+5sZgXLbLfYo8gj6N9gQhJ6SCpFK5s5Tv61R\nlrC/\r\n=dXWQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCCchVEjoDLUIvGNtEQfZMug1EjDaV0lnUEowGVV5g2DQIgByOBTdyXANIgzyGdS+a+I9gVwmqq7EmWNlbFcr7ruZA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730102641_1564482709641_0.7394441807909269"},"_hasShrinkwrap":false},"0.1.22-master.20190730113657":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730113657","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"955b2ffe636ede711386ce4748a974d490e33803","_id":"@atomist/org-visualizer@0.1.22-master.20190730113657","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-3T2f7F1yFfzWlKBTgK4MhzMycVRxEs68Eb+Sxn1qtcw8FXbjaaSoHDLNp2Ywn1Sd2ejHyHqbp/w2MeG8Pd5OWg==","shasum":"521b6c691d09226fe241dd3f87f25b96fb8e0022","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730113657.tgz","fileCount":244,"unpackedSize":4113358,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQC0FCRA9TVsSAnZWagAAWOEP/iqQWS9TKXSh0uU46fYu\naV+YsoFJucFuQxfdYyh/npSI9QGmd3lp/9CkgNXBWHeqGU3u1t1rO1NQuXh6\nlI0kqPlbf1gEHEKN+RDnPHvCkGzXSLZ/IzPOGJeKHTO+DvTmmKLtcefAcoBT\nQIgouhCQirCLgqPtURa9VeZeSRgvgDhXA/X1SF7cQxQ5L9Tg2uxIrxKs+llj\ngFtOFtEYUQxE8mSrCAOghcXUrTi6kC3oqmR3ET8pzj5XgXqH5WAte9RWXNmu\nHLFPtiGAEBTpFMpNjLhHUkRrhoYXL2GAwkfJAPux0osoSCKA42z/Qhara/fh\nQQAi8VM4w+GH1MMbYwC5PqdB0sU4eMoBtIPZC3cfji330PGqGxHovxXM0oQI\nku2O7OTSzVkV+iPkYfc0NmS4pJw/2auSi3PWJnO9B8vycEGJVX/APKCkqgMN\nCXms0sHjbeml9YMjKyG9No4TJLFMVzuXwL+7RnmGHeZ5ta9vvKL5oQ43w1Ta\nLwBjmL5/LkAt6JjVwCXE1LvjJuZXI3LEdtvhtBGVtE2alGN4YSXW50jS5UVO\nVYsTnJI2YWKFFnm6mzk4RSjgdkIwyXG/tmOI+jgxncp/llWGm4Lsl6lHP1eJ\nETYWYJ9T0AIQhRC/JfsTp7vr5CmeprpB3Uf0iWxHSrJmr5i9J9pSyHC585gR\nh/kj\r\n=xHv/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVnDCCkoM6lKBE6y1aeITh8rZxEhtqzFFHj+7I2GdhAwIgCcFZAGRDIghJd+2PThcZn9429gnYkyIT9djYZapRTGI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730113657_1564486916304_0.8308983752537966"},"_hasShrinkwrap":false},"0.1.22-master.20190730185440":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730185440","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4566f7976bc1a268a3b05814aee4b45932fc3d61","_id":"@atomist/org-visualizer@0.1.22-master.20190730185440","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-vWHZ6ZBr3sf6vkrGeeno7/pG5tyYMK60wYrXYpqpeHerX7guDqT73i37juVJBn3zUi472q8SZ2vn1C0ypTgSmA==","shasum":"08c963531846add1b5ed4710988ad46ed462f88e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730185440.tgz","fileCount":244,"unpackedSize":4113982,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQJNLCRA9TVsSAnZWagAAAbcQAKMzgxMcE8IVsLNyU0iO\nHPxhSDH/SvDPLTMxqwjdKItqzAxZJLrHIXLtZIL1cLdisAG//WuEQcgGyQ/F\nZSrcrRAunuf9KXI+NbUbxuQ5yE2awfTD242Kq78Jh3a7ReQTiph/tMFuedxb\nahc1Eoy9QyNSdRAFBqzdzctv8zcWsKVTdWY7/gpoxUXNuBnML6mzhxs2+YiL\n6ppXVwupnsLhjlD/3BNDcJfdOXtB/DXqbr5VlVvxCQaaGRV1KdaFeYlyg3DE\npSt2Q5YJnj8/vpsG0vCz3QywU4WHc3K94p3i5ERvGwZxlQ4EyaYFiEg/NR9p\nLvMvOO87ORnEEi967/v115rITJHSfwyyvnm1J9lbDych+t4MQMr/bkAjB3Ma\ny+DcAH2iMSOnxsdiTwVuI0k+FYA5UbkTs3uWZCtzbJTXiUZIPN3yA74wQvY3\nxERnOpoFzd+ZI1PlmPsXDrA0kFO4Jn7S3hCUdA8HTdjqxLHGo6w5opV/xMhr\nW7NDLzmzKIott8BPHj/S5ZecqIQ8oC+cPReito28B//ndOgT9T9g60jDL9Z5\nGjVbkDwhbLRyufvko1mdopaC2+Tv7R+nQH2h7l4cJq4ikau/E3Xf21FUd61e\nGswQK61UPPMXdZd9leTWdgVVvrwGBMl7rmhwJ8dtZIETQglE4ukHADJ3yDD6\nZOD6\r\n=X9q7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC20J0BzGMdJVCvmXJMFshKQIagkCt6sS0c+xJjyoMsJgIgY5uIB5LOsCSifCL12uNp7ZmG7YI08KbcRLY0Wyqluz0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730185440_1564513098878_0.5179818947494321"},"_hasShrinkwrap":false},"0.1.22-master.20190730220152":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730220152","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"22cd322ee4fb2a0194f7cf71463b01b110e4ee6f","_id":"@atomist/org-visualizer@0.1.22-master.20190730220152","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-s1pexX3xfYJhS1ElBOZawZn9wV5cZVPq/OdhdWAT2mu2Uzkmlw2m0y4hszeNZs5o4HHUw8fHsrN5Q2FkxJcRZw==","shasum":"769856a073a9cab29cec74795f3daab9dbbb2aaa","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730220152.tgz","fileCount":244,"unpackedSize":4115043,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQL8kCRA9TVsSAnZWagAAaAkP/iQiqGDTkTjDqoxqv221\nsLhKuSU7M4wHIAJJNf9QbFzUk+yKj2eRe0Xul40PBjG3GZWVu2SytWntEjfv\n4weCW+v834ZppozlVZK3cnX+jmCvcDpKwDeTO1PBJsfFzvJ/9EfXM5svbZf5\nATkXztFMHhXDrLzYpA2t5/alNo4X1/k6EmfJ1dEdab7uZMMEtRxnlCy5gZrG\nH/XriP7X+0R+yUKc+os0q4JIV5KTv0nSGgQmIvzcSuhnZeiFKPRccnaVaT97\nIN5KgCFJv7bwr6oj8INo36Pb+HyOaO2yFPJ3dKeQteEI+9jfzKjRiMrOoQMT\ni5gaQeOPLsDWaiZO6qjjNgcFuX5j2B6PFfUP18J0ZAtdlA3/hM8H0ou1Bz/c\n+uygARrxnS5YtMgsK0d3TiXEEQ1IR0h7TtQhZilp+6tlKKe06xuZBDfTBAy+\n3XKk0MSkxDzjFf+qvRAehrPd2IYg1P19iaA9BjZ6dTKlq89+8/VJB90UPnzh\nmMImobAN+vEsz7tLWkFbN7OM4Qkw+6hyf2lHRhowkOV8wSRAytBULeD61kuI\nXfCUTQI3AjUzkRBW7D+H3LilbBLj+q9d/S4uAe4Ar3dLyAmQGqcKNKtaFivC\nJUnwICqnUYBBIV8sL23esXNOiR2QTOfHZELpaxK/IAT01bbaXs+p1QkV5s0U\n1mP4\r\n=+9+c\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEIdE1uZzJKdXuSCZK/d8JM/UT8sLvS9rwSOyiVN3W2rAiEAkBnfZMCujXz7HyyWcBu3NNqWYZhaWVisVIYjQLIrLP4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730220152_1564524323089_0.07759392204087967"},"_hasShrinkwrap":false},"0.1.22-band.20190730231546":{"name":"@atomist/org-visualizer","version":"0.1.22-band.20190730231546","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2f6a136ccc3eb3b5a4b57211310cad74c0d42432","_id":"@atomist/org-visualizer@0.1.22-band.20190730231546","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-dhXxA798goUgXRTM6lV+eVTSmovjgLKjTbQSaF8Cr+baQlLHyGHFz4dHm3nbKju+64nXWnYMDJhXKINSKgN2BA==","shasum":"745c6ba4cb95da0c33bf6beb0563162e2aa1a1c1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-band.20190730231546.tgz","fileCount":250,"unpackedSize":4119504,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQNCiCRA9TVsSAnZWagAANKsQAIdjwdcmDGsII/NSbwCE\nxgTD5/odgQpycu7Ynum3bgdIS2Tuocea0aHFMPldueGlZalsi4TBU8+ndd7K\n6KPB+k/YFMMNl1QAKsoKTr8MLQmvEkkrrmgE9ws7g0ClkjaGQ/fWsA508bIh\n2Yrt7PZf+7BMDHcAufr3sV/t+jM7FfrGYI88LlmOjiZ8VoWQhEY6kwFBzzHS\nHZvgcwvOS/EoNs6CRQU+cRvVvTA0XuH1yEz/yM7+//KD7/twlysWEBeoyoLi\n7VMzWbVhW+gEyi0vXxwTRXAlO5PwAO/kWc5lwB1APHNLDh2QEqfUXP0fGkdf\nralYgQgqu6YXFtYkNbSDoCq1A7gHpXMkyhEWkF2tc08Tel1411DlLYlXS2G4\ndzaY2Ia04hLvJwpxvqt9GPJvDWQamfyGQJ5D0tfe5ZCjSYVNbDMWnNFka8oJ\nTzL9MKBlxFmKsohKgRDiCswTVEqoT4hsDfN3s9ulUhVISLG1vAkyqmkks70J\nVkcGictUfx6wT8U8vIYbf9s8gWIx0KpRfDCWS7r8DonTu3LvU8+3wXVynlvv\niu8Cfv7/GVxhc9uZPpNzFkYYutfSDp0TbNrYKbj2NV0sRX9d1r1Zl2DQ85EK\nX2op/nVoIYBhxkU+47v+g0+OmnmLqnNtH8gAwIFlRqVKZQsbwnelV3hOf9a6\ntzo9\r\n=8QPv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDpOw9c3ppiBPw0KXd6v2M1r33dejZnUDonx3t0XM0C6QIgALYFFA8PjZRrQMIOHMhDkVqqAM3Zi75YFIOdpD5wuxE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-band.20190730231546_1564528801638_0.8352625969311949"},"_hasShrinkwrap":false},"0.1.22-master.20190730231838":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730231838","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3eee707c4c737c15b2a65aa1b469cd134af9f3f2","_id":"@atomist/org-visualizer@0.1.22-master.20190730231838","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-movUHiauH4VKRNjodraGROK7oAOJTfTCiF1vZErBOjqq9erK862uPEHaJ3yM+ZC8Tgtqx+L8yY+mQ4VQ7KLDUQ==","shasum":"d9fc58a775ce88bb5979c7803781d28a767a2d54","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730231838.tgz","fileCount":244,"unpackedSize":4115436,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQNEUCRA9TVsSAnZWagAAQ5cQAJR1Bw5Y7TFYJnCunLLg\nDYBwPFQdhAUlVBW7vTMA9RWMupQ7aPlgvlw6g70eQbxPfBsHxylUP7w51IuZ\n1k+Tt7xqaBilQlAotK/jTr9IbUjr5izO6H7DNkgqIoCdyVMSM+5CM+Rh5Xdj\nmmA+55JwxsM5uZ/aS133hos1v4/k+wh9pD78qlAMvnizgNV5LEbkvXem+T3e\noeeOB0FOCUaaTrzbudWpmwg7zpgSVMTMzz4Utew6kbkFV4xSbj0NCSd5xjfK\nkcBwaIq5cpImS4j6gHVuf/xD8sbqj+9yt1Je1ypl3nD/dVMnvAi+ILg88bgu\nZ+JkC5vLQVYyJLLtgNaNwZHLDKjxqPfn/GeCg5ioxlgfgEG6BEHhvQiT9zUO\nQDUTwYgO2a1/91kRbra4ps5lAtEqRM38bjUPAgB9HtPLIP/0dtcdpxoam4aX\n+aKl9YoE6Gp0o9eRJFkrkT42cW3hsu3PdWGvbK13vDFv9QJaJ296FodLyKPa\no7Eb9oqNJGrJq10nQjG3QT8t2J1LGbupfr8pot8foaJn88OhkxOtrZcfaDX1\nxtl6kHLhWVFLtiLYguLeexCL7IWgiwlMyIYUqFqQp27rP44OxVtN2HWf2UIL\n4zBUU/2wAwIc1QyJhUTUzysvpyjCIbAMzECFZ1KWIn/epbeTz2rd6WkQvZ/3\n6rYB\r\n=FK9O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIADWe1vc8xDN6gfbLVlWeyD84RsoLOK4DtIvVbwE5paNAiEAmefIiEeql2RGaA5UaU80XPvBeeZC2Ls5QKnQcJFVVBU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730231838_1564528914960_0.22825497691946572"},"_hasShrinkwrap":false},"0.1.22-master.20190730234632":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730234632","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b7726e0d9bf34f38fdb0188b074d27304bf5eb52","_id":"@atomist/org-visualizer@0.1.22-master.20190730234632","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-vogwVIZEHKwKkeaad4eDiNTdtdw/lpkEL+I8uNK/2wJdp0/NFx7AIsKZq3RloVMDoyLJ47LoPtIwtQWIU/8TYA==","shasum":"04a509fc74317412402849a9c97e2338e42a82f5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730234632.tgz","fileCount":244,"unpackedSize":4115452,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQNfWCRA9TVsSAnZWagAAEhwQAIlsu5nBBzYsiz8RidPr\nljNrqOP4Wl1W0TNMrPSq37w6fwinNi9TPEh0yLybnx+DrwZ2H0RFE3CNrfjH\nTIL4tpPR4MisWcIopMkPllr8UFPfmpGCdiLDhlzYwo4mALbMOCApePAzyhbS\n1NIFeSyfK2nqtuylHNDzaYL33biUsj5jV+bE18Hw1RQi/2G/0DXUxVDNEIUa\nWf7kDO7kgC6QPjLw8JrDG45b0PM+FgFbWE/vf1NlPiic0NCCI2ZzyNWDz5S0\nl5dWivTfmlSV8aM0zL/mCGtDadRQVsEHuC3tQfXLPrIaTvWCZZ4MAjaT6lTF\nERip6OlJgF0n7opbT1eKzbAyLabvswyNPNCcuHDLsdqEUO7JjNInCN5r1Tes\nicvV+0RJY2obtEKDF92EHgNDl9SRi+r0YuNxpKNIKl3a/RDOd5CYuObRXjOH\nosR8by2IxE8uCIS89AxhGGvNXO7gR82ZZlEizSCQ1K/XVg3KVjY+iJHiEYer\nNSwLzpKzM1/YcPL3u1jxJVxDUDthD/7UuYZzw6QUT6wXgfjZXrQrYNzOR1qX\nW1w57gWI6f1LMlqUrvJcHeZwrAEuPSPq/iZbSScya5Z/nje6TNlL4NTrUVDd\ne+tSDTXZ4G4+ZTQqwTIO+nkkwPIBUEs8QZdUqO8xuTUgHNQ+T33zeON31NPA\nSKNR\r\n=xsqA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBvbZLwv0XbGhQjvJP3c7L/7co2eV8oTRbCz8DMtqw/6AiAqQbUw2UIpz6inK0vkDHh+ieY2aNCJ5py9+jk/bCmh5g=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730234632_1564530645982_0.6270005585910916"},"_hasShrinkwrap":false},"0.1.22-master.20190730235752":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730235752","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c5d3424df11ee3530be2837477b4f3ec099d2b68","_id":"@atomist/org-visualizer@0.1.22-master.20190730235752","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-DdaA8Gpr6U4tvZvMM8547WIu+gv6sE2CnZlE0EBhbgOoU9pPggsFkvKOC0sQPuoleqFL20mZBK76EHIigUnxzg==","shasum":"b6d7ad8cf0c31d5fa988cce09301d9584314e40b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730235752.tgz","fileCount":250,"unpackedSize":4120978,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQNqUCRA9TVsSAnZWagAAfQ4QAJAwaxhDJMOgrutaw5qa\nwTB4DkbBxZDMda6j98ZSlchcgBb1eWpFzbDRSglDpevgGR/DOR4DXUcQ/8kd\ncne1sSFElxgb+pbZae5n6TrAMjPXbPb9BtpkQv3O2kMd0dVi9P15v93NlJX4\nYPeyn8h3ZIwvefvxZrz5E12Okm6qqIcOwHyVYULHCGRsC1xvjkdrJ9gVoSSb\ngOAMHNuuJZ2GVO4c1ls6JTFte92aXx50rxXFz9JHPMq9xVyaN92nVYd47v8z\nt58N7XGqJRAiM6UpufV0bjQY0R20WrKJDBrx4i9BG4Y1c93Ja+/IKfwPC7me\nz6RYaqdAL3ZyGaTw8znE3sZX7Zem4h+gAHIozocE5Z93E/9NXse02B2P7Syp\n2DsTk/qFUsNir2vBMzmBo8iBMDHspBoWqipdcP4gLtoEkRVKY+i/5RDQzem9\n+iD0qoU0o3oYsylwarRgp00Bg/znrwEHgzDB086XcvOps0kgu/JWqst62mdL\nmEReN1URxZLDDGz8ZV97vfL5fafgDPCjDUayFDjjcTpSDU9LmC986+oduJG5\nSqd0Ye0MWpIK6k6ZzvdJgplKgMRCdvnznNvKPVS0cY2ct/pgN67LoVR8DNp2\ntnkkxVIJaZnmfXTFE+Xbc7ofCW1nZu/Xzgaao2zr/uhBxxgSs04J4xdlE+4L\nKQkL\r\n=5eeG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFmdBxh4mTzr1m61822x7AUDpzDbowoWihSXgA/tMZQCAiBQGot5Y4kay4+i7yzQu/Y0GzfMVpqFz+y7w/n2mo8i9g=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730235752_1564531348171_0.5040311884878799"},"_hasShrinkwrap":false},"0.1.22-master.20190730235852":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190730235852","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c5d3424df11ee3530be2837477b4f3ec099d2b68","_id":"@atomist/org-visualizer@0.1.22-master.20190730235852","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-GSdKnIv9QtMglHdhChovo3iw25x5FQ2AwoOml5EC4fJn7rWu98KnCDvp0k3nI87secGNLx7ZvGvt2WDRCNpzew==","shasum":"79e8ad7b640a42d9722ecd9117c091a1f032ef4e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190730235852.tgz","fileCount":250,"unpackedSize":4120978,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQNqmCRA9TVsSAnZWagAA93gQAInOIHVyaVYS4+hLHqbJ\nbrV+osNmXBlmNlqsWoJ2CNJwPjZddtpJ6ZpQd7FaoqzPhmP7A77x9Yc1NJCP\n9eXY21lPy6409kblYRRoEbV39/17d3fPAHexbRrUqJLTkNN9L1YzfHszfN/V\nfvTpgMuR+xvKDO2HW6XJMGmsSZUavU6MvV1UwBmyIsyDQ6y46jKSKmHQYHlj\nQq3RoXfElssdeTHwJffIH5qXKQl7RWfPevDfJl/it0chyoCU2EAQMKgOjI0g\n9NRLf0dvzktsgrxmOr6KBua6r15UPUNhgLQh2QLLcubBGYolFyRnT4Lr5zMm\nMeQ6deSVI56jIV1KyD08zWEziF230sldNNfXqZNtvuvDVZM+j0Lgt6EoxELq\nMuFpbETny2BhLFe9llCUpiXso5Rb+EDx3HM8p1XdclN6bGfIGkhjCuYBUZxN\nXPceZRr0FVG7liaG6SZrkLD/fkJ5p80rw4GD5VWPX2BE7z7EA9+4wk4zbmcS\nmZKY83rDtNgr9JsnvjmvUdhc0zUSGu9Dk9kCyiCwz/yNAcZtVLAePdhYl06t\nKg/+K3Is2lULLVyLpIuWtPcpse4yEBw4mTFpv0XCy+pF/fzB6DWjzBI5c1aX\ncVV78O+g9PfEiB5laOvhf6jRCF6TCUYABceDgqWqR5qPQG76oxzlr1NNrBgf\nTjr/\r\n=OJI6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD2zQhmoQ4Tp+Fq114l7rph4dOC0gefhMBCwvPA0S2UzgIgeOO5O7xTohL8pDrNBF49+SrnkhYNq5qwov/wkSEWc7U="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190730235852_1564531365867_0.7367073317378552"},"_hasShrinkwrap":false},"0.1.22-master.20190731000451":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190731000451","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0fd1add2e4d42232b1856fb8e211f0acf9e44fbb","_id":"@atomist/org-visualizer@0.1.22-master.20190731000451","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-sTsOG04fgWlQyCxMcZ0qL3ahNhnLRZbgLH1jB4Iay8xoZw9kuAsjya1gGV8C30TMoLtJwgvd3hhInGDwLFf5Tw==","shasum":"4d6b9c54807086046aee05643d85af00a252c05c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190731000451.tgz","fileCount":250,"unpackedSize":4121076,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQNwfCRA9TVsSAnZWagAAU84P/3WjallhvZbtHYSZZpM8\nv6fyx8/zIeebsqLnUtRmsG7mv3BjihQyfjuDXLL/YDPtSYIZe0R1OhTzFhUu\nHcAGN+2fFZEXPulCm+d/ia7FSEoOh31/AI3Du7p+Xfx6Fnw4gh4ErDueQ478\nQ/vmTkwjusYb4z/yAy3NqT4eMXvtKx00w82AsXFGPm+BkeyVaPIAMPwtvOna\nnoMuefyWd4wTUNmrxok6L5VUwFLQCCJtSPTHMVoMkS9Gm9heMC+2ibqVgErE\nxCWHrWe5L2pL0n4zv+NdsrNgLv+aJ/w6vrBcbb29t4x86bcEXIdEHbg2VRMv\nNCkIRvnGGCoV5ryk4rJ2VT6xJw6P8vwxQZQcyOyr3Agm3mnikLltUBiJ4SWj\nq8czHVOPYeQEoh+Ef5E638PBAtVqhRN+XRgaiPdFrFKsb1GsJylhPf03lpl1\n3qTatGmL2r9NDn+Xn2HPD0OrGIA/DW9pz3Ev7JfzCDYngJgRyh9zbEMZcxO1\nNi7eOahHeGxLVFH8Pcks/Z7AfauSV6jNEKAoMfvy0Xoq8ATbUbn+tuINNjyw\nYkLzvPsLwJhs6zRr1UL40QqqxmUzCsmzAgDRgco8rIkUa1ouan1nigohy5Um\nBII/KdIJFzEh+Kew4UiP3r5rLzNVJhPj26OtWm9WCb01YB+Gv3l1LqL6K0ho\nQifS\r\n=Rw6i\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA898H/S48TWDgl/wF4p6BGBTPVc6jMG+yMUjGjQKj+9AiAKCaFeLon2k74kRHddCdXkkhQNuTZlU4MuoxDL8+61jg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190731000451_1564531743139_0.31810923554282344"},"_hasShrinkwrap":false},"0.1.22-master.20190731064609":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190731064609","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3c15ae41860522186711505f5bbfe43f78b718d9","_id":"@atomist/org-visualizer@0.1.22-master.20190731064609","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7hcihqBoOHLj3XhT5uQQCrw/nGmOKz+EILok5QCpfFa98kmfMUwTK1Ezj56KlmYLIWVOABbDYJgLFkKKJsJHfg==","shasum":"958a6559a6d0b02c41848284903dc5897be4a58d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190731064609.tgz","fileCount":250,"unpackedSize":4122631,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQTofCRA9TVsSAnZWagAAWfMQAI5iwg5KqHIyo7wGf8aH\nu5ammVwfex2M2KfhzyvqlPnYri6LacSz7SR5Ayl3Wrg69ZPubL2AivKLGDK3\nXRxlsMv+kBJWDvpGS+DtIkUFCjL7ffO9FwgsGnWPEhKnuCRmFwh3gAacqlDh\nrP5SVcwZkGffWexz3lzmaqxjlbvEUWBggKZTll7sFlL3HLxbSBXr5bHWHtMJ\nxaL9in7mYXLokLjnVaSlh3rRaTzLU+sfSExadGpVqDl0JWtC3y5zp3IjPt0E\n1PHmwcGc1qTZNc78e6lwH2eL80cuPSVGsjE1HQd2pNdyUZjKNb3Q0ROm3yPx\nKD05W7zB6ONVzQpfI4fntEEBnBzEHCAcpnQ4vGvPuYZtp7/dwJu0GEq7tsxq\ntNIHjSXWQ7QEVIwGD9OucJNdsZ3LV529Q8nN5Ob2vc4Dpzuy5h0uuVmoyecy\nm7RxatzA+/MzQeSSZY360y10Wp9EiX2UpLENnK+8FymRYg9V4gbx9H6E9XHw\nXD48Np/O5bkMF5MMsfkBknwH8arIuPq2jjEMo1iHFk/3kccmZweMeL7sxr5c\nkLmZLQSVK6Mkb3G2GAaXaWG1ZOYONUx33P1+FR4Fc7mVZw8qn/w2/iOhe4xh\nuE1Eiggry+Sq3mvGHyaa7tHZ22aRyljS92njFKZ2cve7lWx7fp+XTlUsgBij\nywb6\r\n=Un0g\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCShrAzoKTVqkvQUS/DJPqExbc5nVIylKAuLS/rxJM/qgIgV3l614ISw5D7xeOgcvnRChSp3udipvocdQDkSLZlfOc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190731064609_1564555806029_0.4762511170292507"},"_hasShrinkwrap":false},"0.1.22-slim-190730.20190731064839":{"name":"@atomist/org-visualizer","version":"0.1.22-slim-190730.20190731064839","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a57b6154fa084a0b90fa4e350562fc4609d15d8c","_id":"@atomist/org-visualizer@0.1.22-slim-190730.20190731064839","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-PGA2AhIt17xM7doLP8rdOmc57RbV5yXAVoVJXKy0/nGfx4Hzi3n/3ganqhNPIcwIpjPhpx+SJJ0rSIlOPz4auA==","shasum":"d8f682b6deeb3b7cfd3b5954334de1241979a89c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-slim-190730.20190731064839.tgz","fileCount":250,"unpackedSize":4121200,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQTrSCRA9TVsSAnZWagAAjkEP/jryvCq9GLtCe7ij3h4J\n7v0Bc+kdR7w/JVQUQ09qVT8gH6FusXB6g5nopvdqqN1Lc0Y2KpdE+4LBNnCr\naJFcgA8bXn+2nmVoNCFvh3+xs7cDsHmL4ZeKgKKjLgRWxLWJdlh7La5rwPGp\n5cLXe8zLEqh/C8cxOv5LX3ZkOYpP0g6LjOYkCqMAdDKgM9Z0V43PVTJb3ROF\nNF7nw+4RAbmylb7xZHabK1NDUAOgZI41nHAqt6vEbXbVgod4DxGxnUg/lej+\ngpNeahmvoJeslHQLvifZiAl6HOvFJo90v9VfvgAh39QliaXgObsj+POLL6eB\niStevIp9L5arOYreXv+3Q7b73AVldxNhNrklTSZMU0UPYpxE5O3Za4cQbWfm\nK+CLuQ8Ni4kzW0J7ReaRYqFYzps82ZAi+sZ5qU/RWiAZ6vdtOkng9yK5ttU/\nVGZj/bbQ6vDRVR3Kf4UTaNkSOBOayoGJbeiIUqulBshP5psng10OHXu4i3nT\nmIhc5OnfoFzQFdAGO6QJe1xr/WNJHy/qX8x6Cn1cNRp29cPD36nxZDEM8DID\nWYtYQGKYEMlOV0VPgZ/ZY06ZW7tq1kqzJNI66FqgUQNCpsG8oFr+VN5oTHWo\nZ0pFwUc2TgzHVmXINcLBpE6Ml87qyo9ZGAGL3zREjnf35kC+KBga8LicLxp9\n4snR\r\n=GapV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQIp8sOwcXpVcl0+HC6TN1NttFqLot2wVIGlhhqjZ6mQIhALb7LrN/BYFyK6cajjkjZXmkcXIyRPXVd02U1BzrUYqS"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-slim-190730.20190731064839_1564555985423_0.857304790400305"},"_hasShrinkwrap":false},"0.1.22-master.20190731072510":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190731072510","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f63aac839b1a6877c4d65e67497a3d1fb8a6f856","_id":"@atomist/org-visualizer@0.1.22-master.20190731072510","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-SJymqnL/ePyi+MLO7E3T5RB4OByto8Pw/c/LUZmW5Xr/PQQar5McY8A45pzq17FcFsX9mwLtQ0pUca+bTBmhdg==","shasum":"2f95892010c49f1fd79d5899cc24145a4bb4e54b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190731072510.tgz","fileCount":250,"unpackedSize":4122764,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQUMYCRA9TVsSAnZWagAACf0P/jvHKIcv1kiO02UGuieM\nv6pc7JAD767V/qodLeeAl0371sVYyUE2LJLTHShxKElNWHDakr08qYlYqO+3\nn2Oy2eL3W33pYhIaMGU31NJRDsE4p1YepZmj/rKyCx/nuhg+TMnOJGSj32Nm\nrTgovUpIiMTAGhsmRbjz7ohbDwU9isA7Z+PbQR+v9oRh5hmYYjFYZmgGcfzf\nDsW/4Mnk3/+n1maIU53hRlryO2iPBocNKdWKg2EjKztUCrWGiYBaX/4pZ+Nn\nUUubQ5NlTS61XAmSq1SuDwc+DcX2JsSndZek6miM984pcmBvNM7Ww/tW2oci\nRa1u+iGUgn5BJPYZfg7cNvUdC/Baoy4xAV+QNyWDwo6QiFGlN3FmBHhUlgDS\nhCXs2fQLLpKBzi9cozZuyakdXFWJf+Lv84Yw4T5Rbai+5Obf1ML7vnL6+wqg\nQ6Hh3pLt9Isi3Xqnu5/g8Gm665PYpt8Y0c624vMg/JWcYSZ4DCdQGj0BqiHg\n4VBiHWcf5szZvqIFhMwAkLsCFgRGyS2akb6CHQES83RWR3TA8SYqUEF1jPC8\nCEkVsUlUn7+XZsPV747Ecg1WrEc2lsDdZhypIyATyxK1p2uQqGOQaah2aM1o\nWFfZPDE11cTyNGzF5i/O/IhS3CE/FWu6drzaVSYrSennO7XIwTk1MIB2MNUd\niqdo\r\n=WdBe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDVn759WAk3i2UKzT82/DnOmiyWKc4qKFB18AKQ89N+XgIhAPpeS7ES6Fib6JUXrhYxY/Vf6t+kqqydazVd/og/QfAw"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190731072510_1564558103521_0.488296854638703"},"_hasShrinkwrap":false},"0.1.22-master.20190731073615":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190731073615","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190730084140","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a7e92402a8e192d649d73f637e700972713eb47d","_id":"@atomist/org-visualizer@0.1.22-master.20190731073615","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-+CWTx9aoC3lm6k3L+AeS64/1QEjz0XzjDgJYHtb0QSPOQHc4fpHZln/Gr5zF7jDzlOouAlu/ZMQXGOBPsmxpgg==","shasum":"b5720f7e556f86648a96cc8360d1de139d3db78e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190731073615.tgz","fileCount":250,"unpackedSize":4123442,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQUXmCRA9TVsSAnZWagAAjeAP/1DzdkLROT4/93bbHBDI\nocNPd15VyUaGjq9fuAnYNgbVB0zYszdLIJBVQ/xZuKZTgWgL/lPQo3ERyQwA\nV10EGvxGM6xPJ5q53bNJEcv7yYqkevJoknnxq46Mv0aoQXBJvcY5TsJI5ZsV\nF+Nh2A8/SF9HDQlX/WJwEkPe0raj5SA1Y7kPBwvVY9Top4iBr+jqXBFmI08I\nW1JzhdXNVzKNMFGqp5w5px+6Ryd9xE6ScydgZFb7XxTzpEM26rFcGg3yruw7\njMAx1uCnNTH//HXLgGTTTzBGVGvaixfD1vW8rIvgjphH6GEOn2TawFKv6kuF\nEVX1Y35iXDU87d2gf1WZM4v8ccTgpXxTvOZYB0zVtFlfyJbCjPDjWtxuxjYX\nkkhAOwKd9G95gGq/jamXJQiuXoLJgJhZR88lp4RjHX2q9ZGkhoTZiBhu6GJA\nKnCmriJtQluatAcS6CaeW5U/fcOFvKWO2pWtkSv/WkefE4K1rZE3yRT6XJuK\nR9qZ3fr1t5OQqQxlHD2DT9Bgl7IG95EmdsKRRn6Srs9zxv3aZ9OHPD0D8R/I\nV8IwMCPgN1leiZ6zb6Uf+l3tR0z/ayb5ypUSJgIWyNIyvPWCZBqbPZwDJCWo\nFxJ5m7hTq8Ke2o0lXkae8oTPIvECNBnjvF+7bwguR9vnpGMWo2G8ZJQodPTP\nTkcG\r\n=94uC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDjFG9X72ZX16JqdWM2ge6rYTTiiYBZd7On8n8LKuqnXAiBCBvyYS2IAPC2uMOJX2LBjIITiyd5kZyM/ZRxyjSy3tA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190731073615_1564558821715_0.015802290323652768"},"_hasShrinkwrap":false},"0.1.22-master.20190731112831":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190731112831","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731111928","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"87a6c990b9309f2f7fbe16d5ae4121f27f1e2de3","_id":"@atomist/org-visualizer@0.1.22-master.20190731112831","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-oDGrGhWh0SbKHrEhgAV4lPDGPAvon8q/11DYz+Ok2Zz961MULUA8bXnCQExWpFsrL8XKHkUe1ScyOwNjBe8dEQ==","shasum":"6907eb14b4557e68a330839edc4363d3332bcf30","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190731112831.tgz","fileCount":250,"unpackedSize":4123892,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQXxNCRA9TVsSAnZWagAApVYP/RnJY+dR0Li/WxrY40R1\nC2B2yS0QQVxpjP0ONySvwTxWqJVGddepUFE4uyHCCQuhBaYQbGYazGIrYNal\n0JHc2PRgP1pMyR2xd8OJtdoNavgnM85muilmCCm/nUESLEQG7sKDjFjtpEbq\neKotgO2P0gA+tqbVxKgx42PId66Og1drWvi4zLoJsV36ZR9LXdf++tFMtKkg\nZC5Qoi8wnmJcLOo7bhbxYVUutGR/dp5QORG8VEeSA9zh9T/PdaRJ65KsdzHy\nPnYq3qCfOzEIwsz0jK1hc8eRyhFR2pkifEst5FKto9X1pWfhsEnOekklOxrb\n6TFC5cuMJJsUDMADyXcFDs7YQpPmMljOrgTmFxHH3JVhrcuofSisZMNLcdLo\nub+yiaM4jQV2vnvc9xQSy0OppjmCElGY3WTVcPLpq0QyWwV4e3GR9SguMeI6\n55tllL7nJ0OhULYzE/1P18GZnjCSjiFovEV2qEW4Y7u/i1qPjyViLncYAUuR\n86K75ku/Nkexol4haIgfMAYHOi574M6TPcDFopJTByerkMMvQDV+Sr0piCIl\nPuE3qNx9QTv12fk83ud6PJwyHREuFKj6p9Dhj6jSf7DUgtntvcZqG3M1gE4d\npkVLbWY5YmJ/x+xq2i+RHMssXtFbFcUYx4yTMEBnuBPltfjKgKyYPn2OxwE9\nogRU\r\n=CYHX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCD+mLA+UZm6dW5y1E2zgI7l4rBf/qMffXESRVnAu4F5AIgSAnx31QSl7Y46LwXmeGgQ/1Hq9O8PzVDPV8w9D8Ib7I="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190731112831_1564572748994_0.8038570147896131"},"_hasShrinkwrap":false},"0.1.22-master.20190731131327":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190731131327","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731111928","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"22b21afbdebd18d7630014f3bf34e88a7df0b0ae","_id":"@atomist/org-visualizer@0.1.22-master.20190731131327","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-FzjaA0Qz40JpR5NeVLL9vXcRFAAF+L5jwhBYcur/0n0qFD4JoVDLZBr6tB/yf2zu9Qab2vNjhdlRBCbVdEtFxw==","shasum":"4db057683bea1a169fc4be59127f6a34f6127675","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190731131327.tgz","fileCount":251,"unpackedSize":4127915,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQZS5CRA9TVsSAnZWagAA0HMP/1jTCTwmViApjrrbEp5i\nPw5L5C9R+arsGsjl4qUt8/O4FGvcCuY9+Xw5PBSwtvGCES4zL+gySceh9M/B\nqKaDQdHNXCa3y6sie2WTRP1F8nR7ia4HOHQH1grXZBP3wwBcIKimyeEfmybJ\n0HcdF4WXfzuFXjbjoUQ6rruYtQuk8ifWZvi1SyUBTKaPhtxQpZ/mJVvDmLaX\njTb8b5EKqOmQgKND8d5RCcO48HxtPB/8tDuz0ctdqBs3Vq8PAfjPslWqwu3u\nK5PgSZQ0GhKRQzIawfUfRcXjFwKmk9AJ1SjwcP4Z5Erx0nDGKD/ocAvmCBiH\n4NLTDiBDLEOxMSExSBEzU5st6NiE2fl0Jv9J40EhYnc5iudotlOJTvtXPhbE\nRN17sO93hrCaHX1+uG+cG/awTVMWwoBYTHDvxU0hdym6aTNzb5MGpmUAuML3\n3UXaMPYtSFXyuxlHhIOLl7tANDMhsZg+ZWu8sS4IucM8m+LsHyd4eOgIb5Co\n93CWVXdSerJsS6LN76uhicp10iWCOtSjJCgvuFgytsFve7iFKmky9WxCS8hm\nN5HWp4Qt6wbRakeAKiwlfEPvRokBrx2PticcQjnxCWMCALrmJMnpGeGu8Js7\naE5vyE2Yv1ZoR1GXJNKOj00LmVcAEPLgJyMq412cuHP2Lbf2OhiQU07fKWow\nJDVs\r\n=Geat\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCxOvUO40McdSUq4YDCLzZPHp3NvTm9hYUWh+h3wxueGQIgNmDCSz23LlP42ZYAggGx7sKEnQAtOBx/EnUGD77Yu9k="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190731131327_1564579000983_0.059649785111549836"},"_hasShrinkwrap":false},"0.1.22-master.20190731133737":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190731133737","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731111928","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"35a805fec020f97da565f09a37c3f8440ba9e2f6","_id":"@atomist/org-visualizer@0.1.22-master.20190731133737","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-n6myQ9YJtQtEZdYwPsLgj/nCyX17y3MAJLlLuQIs/ufsJJ+SVixSYZXFSudYuKBK09Dxjq62cpKPx9zgHQwUkg==","shasum":"39a1604d14454bca09ad8f6b1d2b41fc77590fb2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190731133737.tgz","fileCount":251,"unpackedSize":4127921,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQZrmCRA9TVsSAnZWagAAAokP+wXEHS1oBfkmBVjbu6Ut\nJI+5MYlwrZ5gBYO4cpF7KYlHz0M/lw3GE2ATI07ftLIJu7o4SzNkUnQNpeZ5\nDyOqUAxbvqX57s6PuNNNrNOXRz8daQpnjSQR3BE2n1NJWzwr/jlb735o6iIv\naS/whSB8lPJ55r7novLCPOI5moaitOr7se82o1K/iaebZaEf8/q6LOQSFspA\ne0n5EO5aTdznYuYjedUi1GPTpT2bt1fN3pHloQInnj5wLb6+wdElgZJENPyI\n303Ui87VYM1RFkkuGRAnyXGnZAgangrYzMUe/hk/j7z/sdtac0XMymD7vu/U\nrI+4SIBlPsB0S3NQnP/iwoWac9Ey8Oai3/CoXmCdkRlhqhyGRb2kTE1X69we\ninH0bqhdSD61StekPU7xjbeUhRHkMxjO11AWjhCPZ6NDgk67ZqYqJ6klIk+t\n7dwi5qDK/xiG82E20rxgzqwFhCRathLsN+WIN+NzjYPB5HUA/jfExLDF2ADk\nOjcB9CU/RwEV+mwhw8xQrWOsZF6ScPqjOenJYUlO+Duw+hxStrlsYgTuEth9\nKgZ71hW3962NkW5x9lnLmgx0Oc1pD+HOdNlMqXezYmsAufjXKQhva8yyl6Hz\nFYZOFtyfZ1mNx8K+s5SzhKCbKvB/lpcf/QuW9kFxZyGJYZmeN3AwEIDX8QGJ\nO7GJ\r\n=5JwJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICy9y4ZmGf3iTnwNwbfcHq4efGtsWU/nO5ThIgZo0OM5AiEAx5w4DzqhH2SEEZ7dG6RKSNqVWKXBhPWk0/zU1bdf/Vk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190731133737_1564580581837_0.8200082839658387"},"_hasShrinkwrap":false},"0.1.22-master.20190731135349":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190731135349","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731111928","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9a231ce35481be1ececa262a763015853698753e","_id":"@atomist/org-visualizer@0.1.22-master.20190731135349","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ruLW/XP3AbTrUspgebkE01mfMEdDdrYYiJSGq+nQqi4rbXjVC3rkOAN7QEXhwCDYGyaKwWksviUDtnglsZ3Ebw==","shasum":"3b63ca3bc16d6d5efea84df890bfc76055fef826","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190731135349.tgz","fileCount":251,"unpackedSize":4127916,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQZ6qCRA9TVsSAnZWagAAtvMQAITB/OFPFrzPp1L2Nes2\nLUUUikFX7aqtHJ7eLOuky8VoXUPOG6ANVPdREWRnDyftxzNINn47eu7IsM41\nGwincpKwwk6XZOUe5Jb9tdcQmWtoCP7S24XbeiCBsKtXXliPQonLVMHBpwSU\nXxuqfMKumhHbDpzuhaac8aXmV6nPcN8ZLwMl0ZeY5DYUqo6Ysz2N9wC4SKb3\nIHV50VOnfFlbKwxnqMwnSouxK8gyCHPzqF9M4cc6rmca+2IG/a210JAO3F3Z\nAwiJg4Cycc7r4fdmUcPep48kxmqgfGOA+KZb8Pe41g3xidfDEnzdQZnn75A+\n4EvvGc//JKb0dOp1sEuU9D5K1K1+/ym3KevwrzNQXxHZnZ8MI+Ahe6C0OjAg\nbLT4S1Sd6xQLBWjBeTNgqXaWrd6NW2zLXkUWvgUeHlxUR+cFKJ4k80jGNclt\nfRsDVH8XnAUEL3MAYjTqldeLHttizc3Wj0Tq+Jecb0ROWvtIqayhr/s+c6v1\n7EptOPoBzc839djxD+oiLgHik9UcwCewEi1f/3RUa03bsOWrhUJvH0gcA/8V\nIz15WlWv/BKS3PPRY48Hk3pwXKyuUVSMnR7FbfOp7xp8/YHl3qRlhS5/mpUI\nyJDTOeI2dLr2D84q21aQuvQeOrjOX5fozbccjgxvuUuRk0eApvLVpd8wIC5I\nc4Zt\r\n=UCdJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDhf3NMbbZQlTz01dxAs1U+at9kMh9HH0SeDRO5M8Ks9AiEAgt8TL7a3K+u2sxj4wBrNZD5p+kVSR4vh6USA9F0LvSY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190731135349_1564581545874_0.9817513957725912"},"_hasShrinkwrap":false},"0.1.22-master.20190731165319":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190731165319","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"^1.6.1","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731164525","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9e22dbb72dead88bcd8abd9f638edda4b46b9c5b","_id":"@atomist/org-visualizer@0.1.22-master.20190731165319","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-D7Jc3uNzc/nKuXyp5xF5FFrRl4kJMA64YJYD3OmE9Gy4d8UT+rxMnDNbN7aUSw931SUHe7xPBWDkulMYyzxZdw==","shasum":"1bf95b3dd2fc1981996985158ea207710263df5a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190731165319.tgz","fileCount":251,"unpackedSize":4127169,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQchqCRA9TVsSAnZWagAAws8QAJBSvN/Hwu7g4GLpErFu\n8MptXiFsiY/KBcXTbOGrN3MSeojNYegdO4Z7I/q1YYD1t1WS9RIQlsTdMtmg\nRcvH3NqtFZCoZ9vk7nGzmOl/HAdjw8GUrTooTfflwr4R1uJ6/sW3DaMBbFMf\nF77VWc43L0s3bHRpIwhDqhX2ZMS4EDK2drOuxC3vFbDy1AaNCLBPPeSUjLdC\n31VwjkzeovekPax04a8ELD3tq0lkLuISDnBF3LhAklNifDab9XQax+1Bs1QC\nPd+ZulFLEG7jiqu1bLBrgc5fFYUS0pCYHKiJolKa1QpeV2oCe6ig9Dll6lMK\nvApqxT/YZcO3DXUICLr0OkAUOGH1FvARu5KKefeWicyxhOB/IUBQgtAnXiVD\noPDaowpC5ByexK4SNOUQyULQxXj/FFQKBfh+ALGFP+MQNroG6+bZpbD1noa0\nu8YP/zI3IUQzEiufgJod4tzpYA3Z/wnY33MMpAa28ECLPvj8Eci3wwVCsPki\ns94n9IIff2SxgxBWamwr3MxyBbd4sNmZ8IVMNKq1+sbDKjdXSxqZcPFYl6aB\n9VHL84DZGFV8sONMPZCHm4ziK/TdDd9X+2RrlcdsCDt5VW57PZQCWjAAo12v\nvJoPkNyH0YRfBCkumYLRQWcnBzk9KaMMrM47EU2OnwikzzHoFbEGhORGdnah\nGKcJ\r\n=rXCq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEd9D3CMMcCmCKOny7NmFwzBLN91Zi7NjTpu03qWrcsKAiACCwl9ZmA4ZN3lr3SWPF0RNHPZ2op6ZNl46Kz2djPtcA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190731165319_1564592234164_0.47356266192627317"},"_hasShrinkwrap":false},"0.1.22-master.20190731213111":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190731213111","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731211901","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4b409f2c93c77a6dc3df82e910c0d245823f4644","_id":"@atomist/org-visualizer@0.1.22-master.20190731213111","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-L510EFPqNiR9mx1TmloDBIrXQUjGmQ4Nv6OEBOYHQgI0F4sqyRo/3bHeb/bUPlwIpEe78sJ/TbINzsU0dxgPOw==","shasum":"8ebcffcb7770fa6a0308f8b985b30b807d181ab9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190731213111.tgz","fileCount":251,"unpackedSize":4127325,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQgnhCRA9TVsSAnZWagAAOS0P/iZ6PVo+hqgcAbKayQNc\nv4mqobiZmfuXZfUG2zhXDfVsulZ9IlJ4P8TzNsN9f6gIaQERYW9gK/JdcZKp\nDHF8noZzL2gLm/kEmbn5baagpJttElK36g7kYuVSxb+OjAYjy/WIyaxQDt59\nDYXHAIIqQ255vLXdQUtM4h0BxHs52BGRs8c83t7kpkQStI12qLQ+OoZymASt\nxIu2NeZIB9VdlXMcbknJiJSPZkAP6983+2R7zb01kEmZvGLJA9Fht/Ui/Yb5\n82/e9OQdlhCS4FbS4ezA/YqizXgoO5fFAANCE283id/IsFASk2nyVyIpw95J\nGKnxIjU6/MyZiJnk8zS+QhtIo9k+xnOwNMcebsIyovoNwdveCExNYD8D2Ccw\nBRBCKKftX7aWJxSF/T+F4a5kG3LGQY9TmMIwMnt+FMO3NBDw9Iy2xPxS4xFq\nfTPcqHxopKDAJL0twGjCyT7SxweG7IhlmSL8YCIdTR7YcIMesIDixE0r3me0\nhlUOxQYl8EQzinbeZDXL3vw/86RsbFb3oQn9TKbkhcXj8H6jJmqCXQInXwyg\nGBY+wqRHKfETBwACBv7sbHN+1R/lX1MZIOiTABpipBS+ALQxwyMe7YCQqvyb\nWAs3m8QtT7KWGkTPIeLPiZHy2O3yLAGR09MxC6tC+VR8gl3UMLcUHa9fhKY3\nIcHZ\r\n=1NsA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD16nOWKtlWHw2eDiM0vQ0DwTH2qYq+rZeK2UGehWcLJwIhAMvIsL7sWm6hEkmnlvQ6cLyhrzRm1PooOJQyBaxi/UYS"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190731213111_1564608992170_0.8532262312315184"},"_hasShrinkwrap":false},"0.1.22-master.20190731224346":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190731224346","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731211901","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"afef7a625169ae3773be264453ad3929651d1e6c","_id":"@atomist/org-visualizer@0.1.22-master.20190731224346","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-/Ss2FyAb6wnkdGl3LDnZcigZSpChBCGSuqah9nPPqB+sUTIqWe5KfpirEXh5l4CsCP6Fh8DIZTrPaHshht2Alw==","shasum":"14a4d9fbb8e1cb0018efd8f2be7333728f44bc4a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190731224346.tgz","fileCount":251,"unpackedSize":4124701,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQhrQCRA9TVsSAnZWagAA3gsP/1sZupQbaAmKdHJpjgCx\n1iwYsOJO7B6QM+h0s2R1CGkZTqtUVz9FEjoETqZt1hNRfkDPs0U0FtYy2XrS\nsLMCBC/MjiQd1w1ZgMIIUnuACie799J6A4AUQVSjZMF1lwD1PMn7LQ+rTbm6\nuo9Bz+ENUqQPXAdI5Or5KweR9uciOTBq7YDAd77IkaAEK0vM1oJMm8NtR5Cb\nlNDQ6AG7Jy0uNJmtOxGFu4vIDZs+auf9B5QjWh4Yq8uKcQxYs8IWTq4UrMFM\ngqpwFK2CCal1tV0XaWgXPOxM+yN/6ycTx8eXydHSBGZJsfz19P5h83AcH8BS\nDKfMFeb7godzVRKE5x7kuUSsWEtc5CZptSZvcQVToJcDwsfL0XJjDnjfbAv+\nekV4Ufz92NVSxUDEiUhkIpvoyBfJsSCFyG9Cdf57TsHZTyNgrD8POzdt7Jf6\n41Dn8J1gcfxTagXhepzdbCCx33ff0BdDioQFcje58rgWkP9yK6eqnt6kwHmu\nwGFekE3SwDor0ayW5g8CZlpMly2J3ctiIRw+bzHSJ1/z21LEnId4wSSMWN7E\nAP3BoAeVEjI2ISj666Bb23PumDXFW39uUQAdOv6hKDUB7p2EOcOsk9jeMVI3\njNRF9S8k6wAvaWnu+FZZ+nWzPTH6B+AxE2ppTr7zy6A52XsqD8sLMrd01mZU\nV5Dr\r\n=Ohrk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBRzFXxgWKpoWzTQr+PuxPfSmCaSrxIHQt5BBB/le6cSAiATU7KFKBfXYchCHjkACU0Vfg2oWjMky7OtXTYIZ4YRgg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190731224346_1564613327494_0.06564920624273429"},"_hasShrinkwrap":false},"0.1.22-master.20190801064946":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190801064946","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731211901","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5471311f440b87f52300cfa8467e42f07eff4579","_id":"@atomist/org-visualizer@0.1.22-master.20190801064946","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-db5uZK3M3woEW7FJduxOTOzO7u92PBlkCyUfL2hlPN6jYPyxidHEHiLb/0IBDuIaVhWRMd5GYRm0y2mLGyhW3A==","shasum":"104d12e53f098d076221f7860e99e30e2400b781","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190801064946.tgz","fileCount":251,"unpackedSize":4123791,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQoxaCRA9TVsSAnZWagAAj0sP/13Aqhx2r/SUpgDMT2Tx\n4WyOEpJ8eTrgqiPQEr2tR+SYqq09RMI7ztugt2MVT+QrT+Yb70g3+vmJ8fax\nndRyKBQcEVL/ZqUG2mTfJHLqI5HCKb+kjPq4+fTu9RqzhoXZVhFA9EcukLNe\nL0Nd5XmYtkd9lZCooz87iPvOxeUzIQ+XX13ZHI8vMmFVEeYaJbGHIz8Zs8d/\nsAszWhjBo2luKyK4VXaCBGUmmd1u7tG+LfyvGsEdZAKSa9GCyXQpqSfekDzi\nKS1tyGyvLWEfFNa/GQbQF9ZI+fOfJyJgCTiOmpdhSvlq75TDOvlv0C9K46sk\nyE73NHDXsb1ZjTj73q6Qifg45NOA8I8mohQph4U9gj6sC7ShvmctX1bAavil\npGa1P5XCWTxhVUx0sMJ+RwNnVC9YuyRWda7Ri/fLdVk4cbXC2+YapfPu4scf\nN1w5QxJ/dj4jmUPD5F4rGFZWaqyZMC0SHVJfmFQTJYzDcAkWrJ6soMYuTHcA\n0uazWsVdqTXkXKJd0sAdkU4amDY95UE3FwT4XSdZ+ZO0SKvuRCGdu3m9XM9L\nNOhyUKlhd2yTVVL2z125KCc4u78/Ur9zKrMwaXtnejvrdiu6ij02lylEH8VA\nQqDc7vyDvVV2VeSaMgsfmhw/ieVXHpfbi5OqYhmAxVgi9hP00ubPoQ4hR4n3\nQW8/\r\n=W9XO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDs5RPqzG40HUG21Afjf4F8Gxd0ZnxukpqBKpPAtcHpEwIgQeUWVbm3rWj1riYED02XWyrcXN7KrnGMf3OkEILO1oQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190801064946_1564642393215_0.44104648131720703"},"_hasShrinkwrap":false},"0.1.22-master.20190801072830":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190801072830","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731211901","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c37be57da8759cf18f9f3b0efb24bbb43002b915","_id":"@atomist/org-visualizer@0.1.22-master.20190801072830","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-A0BOIFy9VgYl3Ja4ql/teyMijL3qLyNysmCy8H1ku/oyylCaAjTPYI9ZMU1ZAwWWYXVYx/wKDuvWF+0EaZxsyg==","shasum":"9979d79f1e6fa93b1ad6661c51380e37f03c15f9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190801072830.tgz","fileCount":251,"unpackedSize":4124632,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQpV+CRA9TVsSAnZWagAAmxcP/2XYtWDcNhJvHxcS0D1F\nUWrEbUMbZkbnpcFp4ClTW/GYF2lq+BLT1oQWrWTZwSx6CeLT6qxAoT/JkmFq\nWrIFM14gVI3bdcj9DHMTblpQ/qSZJ5WPT3saDcXxljY/el9CHEv+dh/HcdaJ\nVhmlMs9o+j4NKLAarNZBOdh3y37M7HUpac+DdNoAIpkoWEk6cwtUQJAYSO/K\niFJn0SCRzETTaeasrUrmwcwYlNVDL0R8KHYK4wV3OfiHD5WaBgfesuRqQGTd\np5FgAeTrB53VEsPlJuJvKtwA3/gKoLe0AlB/xooELGhhkJokEn/Jfo1jpFhM\nxFQHv9O/p8rAM9rRc6TwRiAsihVfc1gNuJOAj6cGa5KKgkOy3OGY83lEAVad\npptbcO2EvaifV/vh1H4Rd2CBvtveT+5ik8Vr64TxfnYwhsJI5nGz4XQL1IZ8\nuFly0V7595NAA2W1Qs68mM4UcsCGA10BaqPPLSao+p8XjOC8VnQozIUnFUMr\nDOUlYGAVRJZwx12u2HVURTc+WxQuoZC7FjL9HsoMAkmkYvP1PTSKDGJ1YCdE\nRdbXsGNsStqlv49Wh/jxvb5rX9UX6iJ4jsyLZS9zGwXsPnwltFgXV27TMB7E\nRfUvncZbOE5o1UgwR8Hta+A5kWsbgCe/UScLhQiJSkZDbzHiIU82Nk8v9qV3\n+1Nh\r\n=LYNy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC0EeKUCZAXfgx/M3jZF4y6rRq+nNdYbU8OtqiFcM9oPgIgbaymZPEyX27yk34ZGsa26o3EIMqGePBwBeJ5Z8qsuiU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190801072830_1564644733006_0.39314720992772867"},"_hasShrinkwrap":false},"0.1.22-master.20190801073509":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190801073509","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731211901","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"238138d100ab4433b9efba1422fa8e3ffb99d5b3","_id":"@atomist/org-visualizer@0.1.22-master.20190801073509","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-UNak1OeEhG3g/HFM55TsgtDa5FAoSvbe80yeFbYidFDb63tgWMsY4ZI8FZHJxqgV/udUHvESR9jyaK+aclvKPw==","shasum":"69f8e0feb19a6134e997a41caaa1b73197977979","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190801073509.tgz","fileCount":251,"unpackedSize":4125038,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQpblCRA9TVsSAnZWagAAtHkP+wZX+5iwlRBodIgY5rxN\n+mNlZ9DZ9AmYR0F3usJ7/hvCUqsVhj9P4js1pgrinOV43D0jQVCCmlJz0RBU\nja0ZRfvh76V4vzGqi9LUGdBf/ruMqcMN34JkEG4oNDhFaLDz31tYfWvlFWDy\nhJKQA7P6epOF3cqEsws5kWhnrCDc6ZVteJJLjEkuWNDKzYptc3ckAFWietXA\nX5RuLqt+/9BR6z+957k5E6ZsL7MQrBhvmdpwuwOZB/QHtbg31/i9PU494lae\nQl46RkAO2uEzoeiZ1St/xuY77XWyeF1y+6qGRBdN/xjbrV315eZt6wW/qQE1\nqOc6WFhLriXpPpTsKq1EiNmURsUAplcuu6kjkmZwCfx0nMlb9Z5rAw42K4GA\nfGmz7B7f1fyI1V5pH9CC/fA6e8LB5ualvLLAlYPrs7BL3JAvYpSW2zKIgkcF\nDjgDAmrI+FliwO0zun014nJSnT7lfy1QkNIT7t/ms7ss0b1kDyi3EA+2xpl/\no2XEHi5/Ib3i2eIApCor+yCsyovbRLsGEL8GMFmhq7Q8RhPeYxK4YPvwVwuk\nu+FzRKPt47XGPOZDxPwgnSec3FyU/9JjSSdAdFaE13Fly86DJmWcqE12rpHj\n29N2oVEjvNDs5kI+9LHvs/3PTqjAlIVMFca9tae2MUSNy1hiypkUQCRNNHwl\nQNlD\r\n=G94j\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGRe7oQ6M9E7gCsOx4Tdz6zcAEv7BbM+lnGxXMxM2p/pAiBanqlaWBgAd53eDi+pNK4cLF5kGzA4dBKTImpm6H8vXQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190801073509_1564645092417_0.3013568508774216"},"_hasShrinkwrap":false},"0.1.22-master.20190801091819":{"name":"@atomist/org-visualizer","version":"0.1.22-master.20190801091819","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731211901","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5f009912bc1d4898e0bc55ceeeb2e639ad9e018c","_id":"@atomist/org-visualizer@0.1.22-master.20190801091819","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-+OvrAUNREOEjJLydUkoAVSHJVc6Pygi3CsULWydgfllwGF2RKZhbEM5jZtFXOlENQ8xKiQethRh2BnSlJaXEcQ==","shasum":"c73bd7dd3eace8aaaea1bd5af00203bc08a6fdca","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-master.20190801091819.tgz","fileCount":251,"unpackedSize":4125270,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQq9YCRA9TVsSAnZWagAAh6kP/RtwnoyjPhsf+IK35njp\nHtb42AHbjVQMLbP9UrKwQte0EumiPFqywWeA2kAHLMKOLfq1rmN0y0r+k9Ge\nVxNcnbnwHgU5ImKnJ9p8F7re+HYO2QrUY3UyoyHzx2YLwmLks2OoEOem24UF\nXVl32FNWD/y4Ly0Asaoq6m0Y002rRpoedZTGqud2lbfIcZAYw50MD7zt4e0R\ngckJLE6jDU/n6oP47PorzIZN9/E1psEBXc6p4XmkZMOu2XJxz8PwqpekNFpX\nNRVHOYT9fXpriprw1nrzdBOAkAGR3w4ErqHbU7diyljopaj38f/E4nwXKWv4\nYC37lDQHz+/rj8TBEakEyRuL0a2xcyjZ9oqsDWwteP+H14UOkxRDoQp8ZnlI\nPHg7OW6/ORakHfSfWnGFPw0FMOyjcEJRK49nfdVVsinu8wBrla4JWM9yH+iM\nggXKxr444bWsRsTKQ91arar+4xWaRYxEUZHuOnevrHyPkm+Ug63YTise8cTs\nS0+24ECKluN5L93qoLtlz3t5aMA2S8ZHFZfn/fUH1YC4cOWVPMYotxMvsbYc\nM3TgAfcEE7VGfNXLEZZ0fElEXZEq1z+fTbiF2C5OT0iy2IGrLEv02ol5sM6R\nqxmQ+DkK+7VtTrxMQRQ6B9H3jqm2RHht21Atnq25V4gS3Gu5Hv7seQi+terN\ni16g\r\n=Vqvg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCYxB9cZ6tVRMXDlKkJs/4uPdxQ4M69fu6JQ7P0fQjeDwIhAPQsaVGv8hrNSkNbKR7mPw0Nyx554Uzgsom6rafS8eQT"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-master.20190801091819_1564651351933_0.8514881752240107"},"_hasShrinkwrap":false},"0.1.22":{"name":"@atomist/org-visualizer","version":"0.1.22","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731211901","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"gitHead":"6f97f00f54e7c5e5f6a2ee52024cd30d17274911","_id":"@atomist/org-visualizer@0.1.22","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-V5GKeBTJjC4jnaSgDvUSvxsx1+9+MfVweglYF7Dt0S4EFHky9huX46rEWcsaXtkq+RENDxzq9VFpKsjAlc5iSA==","shasum":"8708747851cdac5c79fdece1be3ea0b4bd697bc6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22.tgz","fileCount":251,"unpackedSize":4125248,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQrmlCRA9TVsSAnZWagAAu+gP/R0bGfwdaUQ8/vQ++PAD\nM8jvtxk+mQDxelUX9/DZy/k1QisvTifHjbEeriNRf3NH21koIhKYDiM52+oa\nvDflQ0Zu3Uisqw9FO2YKS/BLZZNNqO9bFBlwSKp0YFBx8nn1nNb3weEYfxb0\nrQMtFUeTHV3KpTvouZJNgGAdZxSMDQ3rs4xWO0GbNLbou6pJf5o0JaLvjGIB\ncm4IINnqMEB3IDrc9b1rojE6va5LpWL5phwNNgFCGQYOrI1TJM3pnxNhIyV6\nsa7a+4IP0k4QlHwX/TDvcMp1LRCWfcb6o9N0+CO6hFB0U865nkv605jcMdRv\nqeAa8+lL30VQ2Iu95iaxREWtwRixopkaUUVndXe0/OB69smtaG4nubd41jP/\niRW9L4OT9LDoVXYGPa8M55G4aiFOJ7CTp2UpXGes9IBYS+ldVSPPO8++JrUU\n+TJMAVP2zd/Z0a03HxFhK6bWJm1WDP0zp0iSV1XBTlTtUYVgydk5ZDYRoc6q\nogUg3fjg2nFplGA4hl6qAwx2NGxJ2xFONgThJApsvlgv+pru7V46KzX5/AjD\nVq5acOsa/smgU6Qg040WKAk3xBPm//rvRFHL2bsRF4427Rzq2yApbmKnLO4S\nUqSZLRlocnGp+fegMGh6va6WYqt4r5B0Uw3p2rqN3pnAqwgZs923y5XBC7if\nBbYZ\r\n=2JO1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJisxKe3G78ikddEr0wtrlMMfy1L2uho/ZNXYAimvbDgIhAOm/1cflWt440vuxJs0GKZ2fxCMFcMZM1nodtB4uQm3e"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22_1564653988809_0.28202553453045853"},"_hasShrinkwrap":false},"0.1.22-explorer.20190801104541":{"name":"@atomist/org-visualizer","version":"0.1.22-explorer.20190801104541","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731211901","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3fbcee09c9a973d62f026c23ce6a4da0b335d2e5","_id":"@atomist/org-visualizer@0.1.22-explorer.20190801104541","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-UcWKWut3Ty7M9+nhuGdWPdOpxooFg9QLw5fpbcSAUnRqkvuHLowlnqCg8aVKpOwY3kLf2xckaEOOR8xqDIegZg==","shasum":"3acfa9010cf45b6eac2204a6648776d342a144f2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-explorer.20190801104541.tgz","fileCount":251,"unpackedSize":4133063,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQsOWCRA9TVsSAnZWagAAVPQQAJAPrvcSUyEy0uFUVlqj\njC0MjBwoj078B9aPNqwqUU6H6qAT8b3ApkKG6e1bS2lLeymhi8h6yEVS6cug\nKsO0prD+WMzv2qWaVQol7myTZoilaGkSkiZYgY9fLoIUq24Af8V9sngdLXpx\na04eFSdpjo5gyBTsGPft2rGkup2xTi5DiLqN0ntPWRC0+kRYp1K/H2ilJodr\nStp5u7B10qzuoynpExBsr5QhlqQBwmDpBzxcEI7qxvkK6bvB65yY3A5P090Y\nFpsW5uy7+ZciAcJuz3pClZ9wn+ujBGLoAiEdNkKsA99zM6HZB8kh5vtDPUd+\nK9DjryR57QgHX4Sksmuh0rmyoF1pn7Go5+Z2o180hq7w2rrMdLpPcAg/Hihb\nmjMZ9dxhf1SBghiEyqseNQCw7WdeDLDerHeDXDFkIzjIfUcwL5A4Mag52PpT\nhQnoA8CwCyhsLIRk/Q/kJn/XErRoYaXTJkZ1IoihplENlb8DR+iAZ6cxnxHf\nYjzTvShFLtxaoFkhOvSsKR0JFqyDSOcHFzxpJVQaabsEoEV8cf3PhTWXjDdW\nVByGDl/PK9IDnxxq5Isx/x/9C+oH7GaXKIHvvbSjHS1nJYaxZldVBGnGyW5O\n6aGyaa0YLvopqsjZM1VoNWKXfALYuzqMQ3K9recOM46gE/HcxcDCNY+8awhW\nD9wG\r\n=dRQP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEupDLGCjsnZlbbmfWE8y1vFa21uVagVQ6eWXJ0+0Ax5AiABC5rM/loZi4QOciKRc0WNt491NUXl+I7M1ef6K7fbYw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-explorer.20190801104541_1564656534122_0.8386257261550427"},"_hasShrinkwrap":false},"0.1.23-master.20190801105501":{"name":"@atomist/org-visualizer","version":"0.1.23-master.20190801105501","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731211901","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5d5d97d8ffdd2348d5d8fa2899099b5d50115387","_id":"@atomist/org-visualizer@0.1.23-master.20190801105501","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-SblLsDm5hZSqETFZTdK8pJ/iRbCGYSmCeF83jrHA8l+AUyKESeaOABBKp5Z8XbF9CVkjJcM5tQxrnzbQeRJ4UA==","shasum":"e603200f32d483841466691a774a407ba64bb3e6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.23-master.20190801105501.tgz","fileCount":251,"unpackedSize":4125353,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQsXTCRA9TVsSAnZWagAAL24QAI1rANaLsg0Ax3Mlnwud\n80sR5r/G9heT5sQeff4/jywuU4/wj+TqHjUIqfdA0+efiWPVra8n2/t4/1EN\nH7oJVL4Gr/LAOegK2tX995jJKzZgpDQ8KDTFxvR4aU0m+MfyF/hvrAVDeKk0\ndKoYibSJsNxtKAoCzdKC7syJkObmguaQXgbY7uqPGjRFpwhhPnzKdQ6fD3ex\nkLnuHm0jkEoiS4JAMMad1AWr6RJyEX+6pi2ttPbt1Y9TKU/C8/whYhR2IsRh\nVYkBa/LDaeFeezidf37XQ7BUvbzSRSiFjrBId3NNwhbBEU0K98lpSQUWFRnc\npHxh3xFllS+HuBnNknjI/qApE2LOtY66vf7xyhL2ryN/ZqaIx0fbIpOT8LFl\nod1f8CMwqG7ElPCcdZ+DfPVSXLPMawG0uysEeQYBBcTDdyUddREtATDO+fm+\nVP77L8fQWB2iECauMMYhmKH+KZIXzl3k7YZGFxmrkAlsS5tJodXvl92F4RfB\npMkvGUkhMFDbqZk+hgRFHcSqhh3BPCmRf24fKp2pz6ap1jfNfnxPVSaa8RH0\nRa/8cigYTg2WMVlawIBgoKUQGDWibhOYFGvVg7C1rbLi+uy/n7asuuuEtO8S\nr9WAHzcRNyzu7Pu1yCKjzGG5g3yEdy/mphhqP8Fd2tgjMP5rf+mYTa/AbUXh\nbgBC\r\n=oIvN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHHQNDcUJ8Gsm7WohkEN6hZnFbLV1byQT2eZQ4TiSVrdAiEAoBBHI5m3CH7CqzD0mJhaPEmWZB2pvDm7IgXeyIrN84E="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.23-master.20190801105501_1564657106830_0.3350551075547099"},"_hasShrinkwrap":false},"0.1.23-master.20190801112639":{"name":"@atomist/org-visualizer","version":"0.1.23-master.20190801112639","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190801111625","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cd12bed8bc5141940e54b06ff1a53df3b0469166","_id":"@atomist/org-visualizer@0.1.23-master.20190801112639","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-FbLsVtpl/WGpdowmljYaCPl1o48TOZmaYAD/ghhLes/eYZkcpDpDUzjoUKPgK3WDXtwgkqOnzSr38z45IjipRg==","shasum":"50581d3227fcfe6e31748f9095b1778facc534d6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.23-master.20190801112639.tgz","fileCount":251,"unpackedSize":4125353,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQs1cCRA9TVsSAnZWagAAyvwP/3ZEKpfdPkKh3VnMlb0W\nrqMTMISQElsUFwtFjJ2U2JWut7zxSxmRMiJIqhFKsupGtNSMhTsG1cqLlr6y\n5xpOM4GfWgDLC2gbT8T4qw9RanTrn1OmEaiTUqf52T2nrbz3jyxrhYFe6MNO\n1YcuFRDyUcgZWjPvVs7Y3xP6vDbi4K9On3Ue9MWyRmbRIwEvyvgjUKdDrOMM\nbVf/9nkRqhqZ8Ot6XVqsfJjPvpIZa1Li/Y+phgQapLG+0k26heaRqvchL+ou\nxqNnEo7b3FYcPO6YhMiPzWPPQjvjMxdVGSgEntiTjc2JiwFR6UvTrM7rXLcF\nyla1t/zIClltyDDo5Tj9c3JtAcmLdNJYd34bUbkNfSQLAtAQVcSOyplS9+Ff\nsDg4NS1cHAv71CjKKVuwMyTq6+pk5aTCSOulfYi9xVOQjDXbRTtBvnkMHmW/\nyExX8cQfSLzY4TaGoK5Us1beZTqrZ1WJdOenYxDjmGi/Q9ugv08QcZJ3iGIm\nBVl7RUbSe9cO+Y0+Y5NntT//U1+9duqLwkNfn2GPiQU1ajKHqRoAkv3t+87x\niHFV3RV9SSBLMG8wiKNcNyu8A3Uakt9UEOEs9nR5bnVP9wmwrdq7sLUyWxcI\njLWNmIB3rSVxQ6+puZ6r0JkPT0h4dux9LwekxitWmmqMdkF3jPf+QqkAFrB/\nSArH\r\n=Lcpq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCdb0NNVa/lfR4CBNCqoe7fSZYaj9lxD5Aej9CjrN/cIAIhAM/AgM1FNsPykmRBaN65iK0i/R81xQMPYWL8JNTR8dvF"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.23-master.20190801112639_1564659035925_0.9838795068701223"},"_hasShrinkwrap":false},"0.1.23":{"name":"@atomist/org-visualizer","version":"0.1.23","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190801111625","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"gitHead":"8f23d80bf1ae5a92293f4f6c1485000590434210","_id":"@atomist/org-visualizer@0.1.23","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-wMXzA1uU5b1REtlnEduOW38a+5LlLSAWdvNR3jKhrlcVLeICZ8qP5O0gPzsdy8mgifME7kmptWOtv7J8V6804g==","shasum":"72987a281a430da0ac8b56815a3d27ca670d038a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.23.tgz","fileCount":251,"unpackedSize":4125331,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQtWpCRA9TVsSAnZWagAAoWUP/118ZnOSBLoezrsmYyLJ\n7GRY8/7+h6pHvfjPw21alyaeUj0Adk/950nWEgNEWbH6sGtt+TRtMVWHTkLZ\nw0N6c881Xj451sxctN2AY9f4+dKdIN6AEypvHAhztFI8jOJjVs9GYh0Y5mhy\n4yThu8OZFK5szpj3oz+2ISI4mCiGfi3YVa5blqeneX9CYG/5B0pKrFHooB0A\nRawXlGIE0tqrpw1y7sXQoumEwegSq/vMYuZwTuMnW6EDG+LjodkK9csU8JpX\n5+A15kM4NmGLjNqmopFOjGq/nHCwuMeiTBj8SPCeNTaSvN7R1FLblCmoIPxx\nJLNSQ9vB00eVWsp0sw0iUwV36QIDAcN5DRDXqAWIjizcmGpClU5Rr2OFenss\nbiE0RfKUi2CD2wAHlQug40S9DhxUnYOBff54x9F/RxiIAt9HFGiP6A00QJDi\n6dn84rMN6/sdzwYWQ0Gx/m1Wis5gs6Vjj93cOYYAudmAdnuoosauswGg5Mko\n/nCMrkD4tTbThzCTj4GXUJLt4U0IpdRgb5jCKk57meC9myucyhjODNJya+q+\n/cbqCfYI+HHpSu58LRh5WdBjqQWciOryBhnvnheHv1rPbHlq1jOSwew/VTbD\nVH30tyn8oEAZ/zLUkrh8C1V+rs9fDD/ZWX4WJhtU03DacUrG/muAGFVdgihb\nJvPJ\r\n=jC3t\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAvJ7ClgPplMs08X5jz4SMVjxpJRcvEeToMiu/CM+jTRAiA3QWpUZ0ZutmR4D0yRTQzYjzhvhKaaPIet4AV9GKuHWQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.23_1564661161005_0.7672404622746647"},"_hasShrinkwrap":false},"0.1.24-master.20190801162606":{"name":"@atomist/org-visualizer","version":"0.1.24-master.20190801162606","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801161527","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190801154049","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"eaa462cd6324295d4e5acfc2438358ad6e334af1","_id":"@atomist/org-visualizer@0.1.24-master.20190801162606","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-MpwFuR4g1h08IBnL/Y1XQgij0X2jscucZPQX8cka2+EDdRZQ/txbLm4txtYtp2jKl1iDlfdPlpNgMvxxEHV6lw==","shasum":"21add1232f75b4d2c191d65a58635eec8105ff06","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.24-master.20190801162606.tgz","fileCount":251,"unpackedSize":4125085,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQxQfCRA9TVsSAnZWagAAy5QP/iHO+0hqWl/mevS2JQ4s\nschDH8FjYLmr5vrPGgsG0BQ4+RypgdHu7Zme14VAZS2fVKAUAAvow0huBQNq\ny0Dw++AQmujqo9xWnRT6we2VB+hEvN2D5I/LaDWdFEoZ19GMlF+l7wbO5uJS\nq9q3wNyRYFPaLhcX5NQJ6FZO66n9cAqH0RRAIwoBbVJPdqvDDQMPtuNEHM1D\nUutf4ZoMCJpc4LlLJWj1UKZEz7RE5lrIFrZQvPPHww3Q7+dtDp712CRJ/Gsd\npSLMXyXUsJbmQL5nbLyZOI9lomyfcbKfy0iKBl5Olta+wOCMSRsWX+Lb2P9M\nt5jTrBvRAJC9QxyVcerFz3g3K4Y8eelCCKv/4tFqNW6RyErSomJLT9DSUikQ\nh+GF0bubg7dv0CCjEvmO2P62qD+MvM7LbVHq+ZgUXavy3tU6muYOon7LTwiN\n30PTN3Civ/CvWIRvzdTgd2AqBNaiohtV2k9507acwKi7WVmVgoNvY7ikHQtc\neQN57HaJ2Olw8aHXQkt1ND1eec154LYsT0ApCh8GbCsHNImrb59QP54ZiemF\nLspdstDVro/gE8vg4EdvTlzIpjT/2yvLO/VUFBvdUXwyVYavqyeAWQROi7rC\nUoUt8lgWYHSGfdoDSOQ1x4bqZ4B9IZrMErVOOXlvJrUthgy+/f0rzXm7eE8Z\n93PZ\r\n=k0rn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDjS64jJqWEhw6rXdfNFVXDbHE6Ec3HIHCknp4QtUCbQAiEA7ioi+rd7qY8f68Zeqfb9e3gXk7oHbDkMFSjFVrNb5dk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.24-master.20190801162606_1564677150178_0.19187991403411986"},"_hasShrinkwrap":false},"0.1.24":{"name":"@atomist/org-visualizer","version":"0.1.24","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801161527","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190801154049","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"gitHead":"856ff64ff111d4ea07dc9467bcc014f12008b5f9","_id":"@atomist/org-visualizer@0.1.24","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7DFNAw4aUacme/2U6jognX9viMK59LhldIHF7Znwp8Q7L+1TFSJBidf9oeWtST5W51IoAl3LTuYnB2CoSVZhPA==","shasum":"56140ced103cfee188b68508ced3026315a9eb1d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.24.tgz","fileCount":251,"unpackedSize":4125063,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQx1zCRA9TVsSAnZWagAAHoMP/j27drHw/AjRXgO/ONGE\nFEnlGQrxOxucMoqJw+oKTTgKAn9dNrGFO6TK4d6HTp+z+s/UFgbnyVQBoG2X\n44dGak8AlbGuG36Xf2fCyp3B9Yx11CLwfZ+lv6ZAXDzzxk0M7orFxPJxwPbp\nrbdZYSxVeXahcSoayNODe/GP9sPAF5XCzWveYmmQhMNnOgSKxDfIc9nFRf16\nOjITWFx0657/19aWpJkXTgvf1XWkxtEyqlgahciC3cdVDAjh7FOMkIwe6Kd1\n2yxrQ9l6aSKOIwL6cVr4kl+YwidgBcVvi8YIy7/HrNz4H3M3rw/nf+KEfZF1\nk7YDFcJtfgSYKa6KQYERoRnuJR0WuXpphCONFIJ8ttuws4ESP2qZuogV2MS5\nov/s70b8jgB9H2RDl4/5OIeTUaxOXADAWt02ZgVuL63GJP+Cr1q3Xur3s97d\nyLJ11wAsagmLaxWxpAp3VFSrjAiKmGK8CWePpmrcKYsfiFcBnn3V3Gatc2xT\nZJw05eo5H5uwohzzCLZMq2BoV25U305/bo3LAorJLP7Ughz1LsPE3kz/hip1\n8o8IjH8F1apmbXV5QGnENxOqb/JRV6D1J2ectyi7TW08LP9O+jS+lyVCFVac\nj2FbteM/bOcBzu8Vovvh7a1eWhmjnn1AMm9unRx4Lx+2DvqehaosylC7kSSe\n3s9H\r\n=bqbj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAKHF/9c2DG/rOLCJY0iQnjq728rK0bSi2BSTSvT5xbkAiEAxcExM2TDcoNZpyNkzJl+Og10oZBTeds8i6UrGrKhYbs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.24_1564679539042_0.4416873997752566"},"_hasShrinkwrap":false},"0.1.25-master.20190801195908":{"name":"@atomist/org-visualizer","version":"0.1.25-master.20190801195908","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801194922","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190801193608","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7ce143d102bca88bb604d89536cf69bff66f3d4f","_id":"@atomist/org-visualizer@0.1.25-master.20190801195908","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-A+9j+FBw+x7kVHJUr4r3ku5OrYfSzoh3DpMEiIT+N66tOiVVNHmvTai1cRvYxUa+/ShgfLqu2PKj16IBxPL7kA==","shasum":"5a1aa7f91497dcb2f6b72b747dc7e02d5770f216","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.25-master.20190801195908.tgz","fileCount":251,"unpackedSize":4125179,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQ0WJCRA9TVsSAnZWagAADjkP/A51Js3o9yQo1Pz7p3Oz\nahQIwM7L5MDzkJUt9qEn0A4/WDjxFeGyJzVrp/0inSvfRs0Kkz0f2JmfptB1\npEvvsDrB9vvk4hWPlVHAwtVsuQnJW2YGwExCTZmcPp3g/MI9xZVJGibBHZ75\n5HpuL0889GH67eM6v6D1fgiddg8v68h6DnZPyvij/CmZaHTnFUpqqukDHnTM\nk4dEGA9p6cMgrB9oE9Bia4Uuplu1MAu1liO2NsC9F0b4RUBFscmHfB0rIcGK\n5mLCPHIEQR+Jwtv8ZjyzhQFQw0sK4sOvH7WjGwiWXCGWZGCy2/QX0P+FM3X7\nhe5R2RFnUJnL+/W+2Vjg//kCThKkDXoT/0eVW3G7VF2xcEUM/9RnELePgtHp\nDggD7N0bTkxDl6mvQM7ieOjiKRsd4nyfkdzK7BnhPE3fkDw/TcBQm+8XJ61c\n8MFFECi2FrbmX/lZd+whYcODWoU94cyjrG3ReQdqJ6rgDg6no8HOiJWg6dBR\nH7Yx37h8IsGrg71oZGyNnc4+aV65wKEKMRdkNOARspc6ABUD1vXXO2dmN5ri\nj52VJ0zrfz+YJcY7kV3xbjdwYvNThlSUAmt9pBR1v6NDgqhQSQXevozSKZjz\nX03iBtgxzIcVYhiK0kg15S+Oa/9CeodjdAXgUrjqi2x3AeBuIh22B850Nc1I\nqc4n\r\n=C6Rs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAuqpGGKSR+JsW30P9TMTHA92tgqrWR++WIHwaDD4wH6AiBpBtm66674dGjMSyLj/gFCTZSeRyQaYXdIDtcffu8i4w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.25-master.20190801195908_1564689800489_0.09358530208745375"},"_hasShrinkwrap":false},"0.1.25-master.20190801202233":{"name":"@atomist/org-visualizer","version":"0.1.25-master.20190801202233","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190801201410","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"886c2977f2278818d34add2bc81a49684fdee061","_id":"@atomist/org-visualizer@0.1.25-master.20190801202233","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-cfVAHe7q6pouLJiEKaCDl9J63eTWEekhO7Xl6d46NuE8DTh8YWMSgDoyzcaHJtCYdFeC4dAtaOn5rvDTxpFiBw==","shasum":"aa77f6c488253551fdf4a8e2b51908a99e633f07","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.25-master.20190801202233.tgz","fileCount":251,"unpackedSize":4125179,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQ0uGCRA9TVsSAnZWagAAFhUP/i+MkRdx4zua23zwT3tn\nJEYCMfMkCdYPXsAS4Gq52ZhGLeoiTBNBx3Z6DfO5PuQT8Klid0sM8apGt6Ju\n6DnBIPrisz6ZBR0pIwwmFe9DNPW5lGzxiRkQF95VFRt+XbgrYKHAH8SHF8a5\nSxho5MPfiIl5TobT5a8CcU4jolXujJUtY3OhWuq7SGbwmy2aJsc96RinP8Y+\nfRM7d8BXoD6PZzZ4uja1uU3bJnDfn4C9T0kbeowbsRm+RKdazIQFiYBbxAvp\nBVA+XmMS/xGlzm8e4TSWpxNVCR7Dolz+onjuqVqd9ZkxP3UPn4ivgMc7RVL+\nbU4fszbl9ACVfFxWQYRp2koZSFz1FzuSjhkqA/j56iiazrI+0e2g7OGHIsnd\nFN8N/mjjHwxALljE72QDQfuTLTgukIcvDi4/04pIJTu52pTYYMOS5UTTjTPO\nJoiPq4Pqqu/cRM5fXzpdyIrGocU2pp9u+HoUiWXD8O1waacXucfNjw7I2Q54\n9HKayp55/kMORSB2EhvEEiBylEAIiF4+lVsvUmRNq25q5wXwgtoq8qABX6gx\nvOyTVnZQDP69aGz3EJu/7y8WOmW1WbMDrzWV8tcQFErzj335oMdP0NQ7nJa1\nvs0pUBSzV0Svmi9uNxe3iqnwroDfY7jAHZrxsU7NuYNMPz9u0fe/YS6xIeA1\n4FcR\r\n=MSQh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDMXLyxHv4ZePoYszwVCrmSI2anTLT4YpzY/aXEdODAYwIgR69rQmpk6feSlCkZp0brTNsLZJoFuTXbc7x/01cvVrQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.25-master.20190801202233_1564691333952_0.8511124105285777"},"_hasShrinkwrap":false},"0.1.25":{"name":"@atomist/org-visualizer","version":"0.1.25","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190801201410","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"gitHead":"c205c53ed30979f91a83f38fc4bc488c1d51b85b","_id":"@atomist/org-visualizer@0.1.25","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-i9PbRYtyXbxLct1k+uRq30JDVDMadMvoPELBV69qcPIxGIi8nh8kdgCdFv2Wor5S0YzBYhiCXL6AztIFqKywMA==","shasum":"b2be420b345fe1fa9ad72c000c39bfbaad609411","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.25.tgz","fileCount":251,"unpackedSize":4125157,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQ02FCRA9TVsSAnZWagAACxYP/0Hw7g1TWysx9IGUvBoZ\n2TshTdzZS0fBOaRf6wHngi7IygPPDXRupVRBYwHDnlorEjHUoazIkVJL4cpJ\nO/u3OWbFwJSYczyBXcTHU+VVQ1LWovRbNbAbaeqvxJzCehhB60xuwESHPrlA\n9AhsnLR7Mz4tpFzPbwflEnStaJEczd99CA7joMWl+oP0ukS6sua8ESnzl6sn\nTNnOBWotA5IhsqH0F06P28SNQEwb8CnQCz4O6jwatDmRKCZvaJa8pXDD2Xu7\nQlbl4jocqFy0QuS8SijeNJXWY6vMuAfMSGb0TcvPg+36L5uwfQczR90p8Wi/\nlIt/Xm7ato/bJFO9/YSdfIsz0dJZXv0azS4tZC2gebHLtw+W2yBK4qFz/0M/\n/a7msW1zFcsKBJrS8DxxbeXcybbJBMZHRSeAMa2+6oCOFFqmLqlmJlTVgS8L\nUq2X+w4/EUgD82h+X3zSQ9WBb+kRoCm8Nuwg05oDMgHdJ6+gsJfevZmADeL7\nRRe+Zbw8eqyD/RJiMSrJeLZmHPkPshipwv7MsWMVGNmiTSQk+No14g54D2pG\nvqbKwC+MoyhAYfIM60tBpQJLO1JT1BIo/Bi+P4blt1ywgJ+sR8RUDD0BJFDv\nvIM2q54ulb5VWjsyzygggQlK3q46osLtmSnKnzHGEB6N6hhYeXayj7BhSb0k\nlbyu\r\n=8yho\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCdMuutImLJ9fj5xglesfMTG3SlWofRi0kTGSLYXIstSAIhAJqey/u9Hoe6paNKW63wix+XebHFAEcdlD11BxC0t7UF"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.25_1564691845198_0.3906656907007402"},"_hasShrinkwrap":false},"0.1.22-explorer.20190802071735":{"name":"@atomist/org-visualizer","version":"0.1.22-explorer.20190802071735","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190727084117","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190731211901","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4e8396526dd56aaab30b3c9d13fc9643ee448714","_id":"@atomist/org-visualizer@0.1.22-explorer.20190802071735","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-0EYuImKO4D8g5BHtHPCnAAW6jL+YXSiGoNo+AJdVBajGUV3FVe8ZBa+fkomzlcp4YGJRAFjUZG8SxnnKCEqJtg==","shasum":"be8a4f810851dcb230bfa469a2fed473f17e0bcd","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.22-explorer.20190802071735.tgz","fileCount":251,"unpackedSize":4138043,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdQ+TVCRA9TVsSAnZWagAAz2sQAIWCZVpRxPEsfzJ1ikWn\nd1ftD9GlOMQvShP84QLUMjkmzNuhCLC8mVa8ySTJy3pJqXB0e894rZKc+V+9\n24Lx4I3TZwjapXhuqx7EC3u6Vg16oRvk1gChsL8mT7CW9zunb9Bxmj2Qj0dY\nZiMVgVfctPrQmkehoBpOvvL5eGj6dKz7hOscgwJ3kXI0yohi91HhTzEEl+2u\ncnP8qERMBfX98rmq7Bj0XhZj8vrBBrLasR3hqQb+gkdvyJ367I0c2Pid2ZHF\ngbNkHYBLwK+YIoFuEM+8ZSBw5fet1DAJ5ZIyYgExC2KCsk6p9UqaGVIf138e\nXz4YCMo20AN62WPbfzsdrXUauR5R4kUcOy5FYA/VptJ2xW0wQHFab7F+yeXl\nvqA0Mp01HIMoKyT6McHu8uljVKvPNy3i4y4CHJRQ81XR9E0vZgcRNEisuEdv\n6uRua/+gOGiDm3QEWYufQZ8rd5ztFKPanrAr3YYyZr0Yh9XaD7nNcGa7cmKd\n7CLL3ITWmFw1E3QSoC8LHKcHMlOSPRcC7xyznc/oLTCn9Uxfgye9+zLo2AdH\n7fTcjYwFZoB8O51DRmdhQT3dRzHC90neZeGkmaBiGfU8Snm7zIMVsRThWQZ9\nuYLWkN5m9pEF/RUUicCH9zBf5RMJbosyrnYaPmXJz9+1N4Ev5rWbYRBenjNZ\n0ukk\r\n=EdC1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCy0AV593xTyuqHd/zS0D9VQ1tsqJf6s4Ydv2WuvDyBnwIhAKiTQ5hHugi2Yhjsaux2BXsPCWirwHmmfF/mswje/Eyz"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.22-explorer.20190802071735_1564730580636_0.220200030854375"},"_hasShrinkwrap":false},"0.1.26-master.20190802095252":{"name":"@atomist/org-visualizer","version":"0.1.26-master.20190802095252","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190802092748","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5b42914c03bd8987392372ae48abfce19cffba0d","_id":"@atomist/org-visualizer@0.1.26-master.20190802095252","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-+pHokWLPhPRHGB3fFIiNSu3BEMpGBU2Jx0iN7QOqEnMa2P6KZ5SEwjaf+/XaqVOCOYyGTE/+LVekawuTOONOGQ==","shasum":"03714ad68905ca18e3f2fad601dcbaba1b5f8b2b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.26-master.20190802095252.tgz","fileCount":251,"unpackedSize":4125273,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRAmCCRA9TVsSAnZWagAA8A8P/i4/jhYnYVX6pgUuODCm\nAlBC3c6Sfsc0zuKYTK/4X6ITxKoRbKmFRVlw/vXb9a47Vqlc7yCtY/YVfyvu\nnfuZ02nsRIyLDoyTWCViJpoluxJNczX3iWKQgXFSJQV/3A8kSb7FTxplkf2A\niW8yNSuP/iB9CpSTcI8nFcSzT+FxyPHDE0n/CHIJAyTwVwgBBaaCZ8UMUg3Z\n1jEKqz9qLWOM/FsT/L7yDEvztPsUTsJIWJwsfcraoUQ+aISEWmvZz9Xchn2j\niMUxcM6yP/iXgPRTbh7z1mTNPjkSOpShvGJ4na2g7Umhd5CXqk9W9ZKRx+lN\naxAjpqfG/qFyyerQW9Si9BxYeTvf4DjpsRY4CrYFwZb04DW27P5k0WgjK18g\nZRVnCwwWUEfiHXMj6yT9DY842lENO4A51wRbn3nTvc+TippHfMt9v5KmbL6l\nFzn7NP3hDqo1dAY2l0q6Zlk7RmKIBTyVZlq13mE6VXIbTw8Zpe6l7tXvHT2K\nyz6NB9eIkZSacG2YVcHu+WxMUreYxch8oska7/X3UGLvNGHlUgJtGluYXIMP\naOAHRr/5pIJb8FeFT7iBv517Ef+g/Ba2UMLX6cl+9sZ92q6OfdXMawHdwqhV\nlLOyG59a44I75ZP7O3r1BGXSP9Do+ayTigcFYUc+4PFxEMb/o0w69xqqJFPw\n2IRn\r\n=4f8j\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSaCxmnGVJm8Bj9eJp1ckJIscR2lRRpVRMj+nsW/btbwIgYx56VrWirBrbTj0RzHkWLjh4LkqzM2Ou/XtG0P1ycZ0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.26-master.20190802095252_1564739969931_0.6843102641782781"},"_hasShrinkwrap":false},"0.1.26-master.20190802102306":{"name":"@atomist/org-visualizer","version":"0.1.26-master.20190802102306","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190802101637","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1e4ed94290e84efb5063d05050a1a825abec80db","_id":"@atomist/org-visualizer@0.1.26-master.20190802102306","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-4nB2Au41q1rtlNT7FuT+kqc+/qEdbS28qiaJYlytKwt7o144SfejuYMU+CTawUTAgXgg03u0CEjsPemMwvbMwA==","shasum":"2214bb4a575b18e48888a041e9f11560f7a45c9a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.26-master.20190802102306.tgz","fileCount":251,"unpackedSize":4125273,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRBBMCRA9TVsSAnZWagAAk98P/jn6XvT3heS+TMK/pleA\nAp2cruqd7otF/hkDHk8GO2vTU1bfg4C5yVcYVPtXR0WH4KYM3VnCIUOiOfQT\n60Nt6bAa055hR1wxREg4kiGq9WtMDI7pRQ7eabvA4uU2rRaeZAJfw3uX7kEw\n/nL8ezKNRvlr8z4Pnvdqki/zuAKU3bgnp0q1U0YJxlv7NHni81SRbMu1Bfk9\n0Y3g9N8/5udyvvHtGYhfCbhL/p0ONOdUqIFOHYg0rFnJmCSZpKS1obVjQR5U\nYwlHybs9j8n4GpnGb/PZXTRNPKNyMhmxwfuwSE+4n6Z8u3kIChltwba4OxTE\nd19iwQjmyXRqghCYdz2NbWe6+HNJvjnTzACJEhJem3lzPI3NH3in9SwVpz8b\nTKGUDVBpnAA2WQqsYH5Pn+bYl8CttCpwpKoN7DmUFy0zRHi7sdOt6wjyq1Lb\nSdpoBZLwyOIGCxpsBdDB8cxrFg9OvQjpIqmYpAXQoyQu6XIgObUnh2IVEMQ4\nfGVMIZdSB7rFlsvjc77hEGCOxeEmKA6SZ7tY5e8gdMN8Ayq9X+aISNmGnAyc\nLfggDfyQPxgAW6fFM7CiNF965JQJYHV/PU2n5Q2TXMcLoTyqfCcuFMD50Wwf\nAQbnfvuV4s470BbXWxyATjHdTR4s5I5LcDVytXm3w+qa4aH0aJiB88F9mDUQ\nYCQi\r\n=KYRl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB1KzGoJMCeLA4y5jKKZCxCKG0wALcntKeqBDpViGCMNAiEAmUdksb0fJlL4x/yeYXIU8DQWUp51iUGR2NTXwU336lc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.26-master.20190802102306_1564741707850_0.48936432003255614"},"_hasShrinkwrap":false},"0.1.26":{"name":"@atomist/org-visualizer","version":"0.1.26","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-remove-global.20190802101637","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.0.9","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"gitHead":"e88f0254e7d64eac0e251f42a31b71a91acfa50f","_id":"@atomist/org-visualizer@0.1.26","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-p17LfcN7fggTMDEgohrRscI0bcJBESHucvoF1j4V2G+HrCRbvBQON9uIaRhaFLjXBhv/cGWe5gON/L9guaYqNg==","shasum":"d27369610f05a8ccb456aaa46d0063392a41c9e3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.26.tgz","fileCount":251,"unpackedSize":4125251,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRCsQCRA9TVsSAnZWagAA294QAIeMD/qtvoKgxBbieWNN\nmbNkyqiiEz7AzEgwB1bQvdaYHpWxnkNfmX/ORLpx77uXKsZw+7+G3FtBLqJC\nUVefFxc7Y0wBW8muiIKsSfdpR+igp4XbKIKmIjrWe1rUFr52dfi71h15bJ1N\npOGppA/VCEh9c8gFL3/9t9VZt8iqCOjgbb/2BDlWar364ze9T/Hgye0J9x/i\nFK7q5QO1PY/A/5GgamTL7nQ0pJS0ywIb6xGns7JCRRU9SsFoD9wEMbJESc/9\nv3uPaHbntYOokYSKjc5bvXCF7Vw0adaOw2XMkVIMc/74koEdPcB4xDb0sj8S\nXU/B/NwXHGcQ8GxlJ2MAb042u2pmYFUWD0RzVoNEpp/7k2M0GiX81Et/JYAw\nBdheJz7Q6HFLmoMgyVkDEYGciiTpWGR1CREYr40zO+rmGfOAhb15f39sM1sB\nxC/tsaqvpzk5jms/tHlAo7LLzOKL6dBn5P/HbwflpdSe54c4pGoqJbDv197P\nkjo51lFhrbrX4KSC1Q3yaGo7BQ7y6/dmqZY+n5V+vHqEW3C+2qRGsoW2SWea\nU7zMEUfVmLLsxMlbP5GAl+VIiuharo+E9muaBaa3+2Zd41S+EntOt6VkNxrL\ne1yBf5zsOJV7PiPkZd456HWG9EChoYLWz7+ALVADhxypHbqorhH8CLJtLEdJ\n0OOm\r\n=ADGL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGCiio1atIiu6rRjMYvaNkdzwt4AZ27IXU15yrPMjfZWAiEArqZyNbcmkXnOsjqLwqr8/Ov0FLsIHiOHizua9K4il+U="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.26_1564748559819_0.705911506473784"},"_hasShrinkwrap":false},"0.1.27-master.20190802180748":{"name":"@atomist/org-visualizer","version":"0.1.27-master.20190802180748","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190802175714","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8fd3ab8c0f04b093fa5c69b22607261724fb3682","_id":"@atomist/org-visualizer@0.1.27-master.20190802180748","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-9qJEEARngjXkTMr4jCLyoBN05LcfeQgBL/ZOna4MuhRHqOiem0+qrd4SBNG/dmeZHrFwTD2qAtO+v0GzMwqxDg==","shasum":"660b3930380dd2c4647e65402737d2b27a1e7d4d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.27-master.20190802180748.tgz","fileCount":251,"unpackedSize":4125353,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRHzaCRA9TVsSAnZWagAAYK4P/2lpZrrpxA5IyIuaJw8w\n+D6+2rIpwW7gSrrvfaL55WoAfrHauaohthZ3dTRiz0zedUpN5oYSqfFC2jz3\nzire7L4ImyIBVhRdLkUU72BXMoUG4gzBsNZRpvoXbmY3RFGFgKU1bSJp6i8J\nmC+OvfqcUwxA+WLZCZvdFnbnjEXlISKHsrMPqLaxBb5mH+mzFoS7TUOpnM8e\nCgerZBqso4vUGGe5qwk4GHixa6d50bOiz6ZGa2e7msI08iWx6M3CyfbiZtKW\nOodouKZjCUXGOQi/bjAQ/8NoikxSigUS930iLxwQY14P5YODVcVe+3CLgmNt\no1WUUPPU9iVAPsIriNJMD9h973Pcbi4bDbDwnZvQx/ZpSrCdQVgq0O5fkuFa\ndLDZsauWJ15X3xOl+X3A/GCtwuy3CoPBVT4khWA7RIsTQP9ZixVbOjCEp8Xh\nKf/6gDW0K6POiWIBJJPj72pbCVlgr7I8I2Y1F/XqTudIbB3JEsnf0ZlJfFW4\nfN8AEZoVleDHPtS/Gm4dmm93bBZqwbCKFxVQQf9UtazpiWfttosKAs972FVk\njZBOdtatLuffAD8KWFGyEqn9bjV23lcgE2H9x9z7zvcvBxEzmTScdETVWSUp\n6SoFVoKsMLEQ4zE1gGZIO+yorSyclVbHHMiYXAjNSu7YRDRfo8j55bTnQ/4L\ne7q7\r\n=pzK4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDZKn+TqCiPj8EHMokEULjY9Tg1eBMG5fLpmOWsSOpRzgIgN/K2uYyCXBkl+JlDq0KQIWTsS7eJQ+BXcRMDj7q/9OU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.27-master.20190802180748_1564769497919_0.56180737442113"},"_hasShrinkwrap":false},"0.1.27":{"name":"@atomist/org-visualizer","version":"0.1.27","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190802175714","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"gitHead":"4e24ff0bbebf8181b1b873273f9be27a8cc91093","_id":"@atomist/org-visualizer@0.1.27","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-IqtLvPiGtxkJoSMSCG+om8GEmPfwYCBLs/t12iedra/+y5MbT0sZKDU70+zcIxmMAxppUo1ZfhgmASptzEuIOQ==","shasum":"ce88b36c91a73b171130c4d107d09c87978df409","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.27.tgz","fileCount":251,"unpackedSize":4125331,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRH6QCRA9TVsSAnZWagAAvoUQAIXUYE3iGl20Z4wjFMTC\n4DF/XjSpKJqPczwQkOYk5knmSESQDtZcm9cL/PMH2MIEcdUkG3eTzjUnByBy\n0yPmKbacjGzEf4GYqPNPp5xeC800+5zTaB3mq2yVgaFD1UDcVIZE0WblFbcU\nc7h5ZT+h5aArhnlR+EuvhQll5zLiGCZcNEF+VZnJPrFzmTB+EiYLEfqDPEI7\n6bUi4X2CBo7sUz4HS7P66saaihSU3kfkePUVWo8wtawH6VxpU4gWhPT5l81/\n98dLNwvi9CCARQWVxA0zzoMjlPqZQAMjDIt8oPfWm1V8bQJyTxL/nwBiW91K\nJGDf76CV4SHEgwwFru5qGnyHlTltvsq+hJSeUE1E2seyJJ1aEyQNaDDWRyVY\nZYPeBxJtoLTTQNA/PExVHJhq5H3zmiCDYgHyTa9KgS6nSMgpnKN6fzan9DVo\nGWohX8fwuGWMRMY8wfOWeNqU+OGzEsaneUHyken7Mx+Pj5OvXI2gb28eIozZ\n03ndDVQs0BEx2/rA2ZrA/CkoFnGvp+qKuNeuNI42NQOWplRqdok8cr/Z493F\ndW2eXZ/vDZazPQqIQ7faXASyE39+Fyz9RK22LMKbhlPWjoOyy+woxJTzUAbE\nKQ208ZgPjuPIZbwzAwSaB/fnnGR0I6PMtvPLWfssbAgAgzBLuRzJ10PBfDkz\nEp8r\r\n=GKAG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEtxx4sRpJMx84dVz+s2vDEZ7BDrSMbW925wp8Gls7UFAiEAmhX6LPqMfikB20mTtA01SmBa/ncQMxF+j44ZT3lf1RM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.27_1564769935972_0.21749343707023283"},"_hasShrinkwrap":false},"0.1.27-master.20190802180546":{"name":"@atomist/org-visualizer","version":"0.1.27-master.20190802180546","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190802175714","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js{,.map}}\" \"{lib,test,views,public}/**/*.{d.ts,js{,.map}}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a9692e2a52519d821cb27d36f559e4ffbce2f31e","_id":"@atomist/org-visualizer@0.1.27-master.20190802180546","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ur4Pcxv4ZkDWdFqHizn3MBTHR7a1AVT0XBTcA4HIaBsGL69YSph7x9QUL096o1eTtO45RbEl9Ed18QduV5uuIQ==","shasum":"0f17ff06f5deed1bbac12d31381ac2dbcb39ecb5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.27-master.20190802180546.tgz","fileCount":251,"unpackedSize":4125447,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRIUhCRA9TVsSAnZWagAAnscP/1QDUxxaTKDZ/ui7bWHm\nSeaAnOiU/aKv9ntYfuBiYxQF0lQM5pP+PMs65+HE/RM8j0lQvrqrL0D5sJEt\neEShZH1sj/Td1G/PwEqIl2aJUF8r1fJvirCbTb2K2sYIArTg4QujlYddo5rn\nhBKDXxkTVXX2+B4bE3P4Kq6S3ztArMIN2fZa+dc8EcRd9XjOdtD1uBz8Xnvb\nLJfte8gfC7w4kPVxDiFjwrCYffyDCRWrgATWzna11GjEkKlysiZimeVJZDaZ\nvBrpaUAWH200J5kETGpybLAWpSuTgLMoglbzHeYQkUQ+ca/TI1W3Al4aDxEh\nadxNyVCg6rWos2pYClB2gUNvzX6SuGZHksYVW++S8+akdN/uOhJVb/NRzMgw\n8eo6dAjjpyY8EBOv9cyqeS1yblfTf9S3xD97NkbFf222eNy3UZK0Rq7n5Ya2\n8ntlAyjOBok+28PGfSvaprGLBvW5Q61BXdKxnkBLxpuebC6o6/7VM/bnxCYA\nNdytyByaylKP84OLIapV9s67sdd77VZjUQXwn/PARI20RV1ttuN+3qU/06pM\ntk3MlFku0WcOc1wP1Csus15jiQLnEFMm+FqWvwO1Oieh5iRPh/Rc6fEioITp\nBUk8SHO2H9QLzZQPgM+cnO3QfdShDr3vU03PP/i0ZrbJO8j+qH63xygtXTk9\nfmzm\r\n=khu7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA1riaYZywDOBZo1B5QQMfvJGwUmDBQ8wSHLoPSB4maSAiEAxY1smcP7w4qlCGnRHqLA8KuG0HmZRcr++2rQq+/lNrw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.27-master.20190802180546_1564771617080_0.25016271077130336"},"_hasShrinkwrap":false},"0.1.28-master.20190802190707":{"name":"@atomist/org-visualizer","version":"0.1.28-master.20190802190707","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-master.20190802175714","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"dd1618225914e1fd0fd2a01d1587d0b4e29090df","_id":"@atomist/org-visualizer@0.1.28-master.20190802190707","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-fQTRgqIVv1yuICRSLhHRTC5Ykr3SXjwxVHZHwAME7mTur/PTzPIHDCtOmwIM7YQbUx9SZhqLU8j1OMKtG8TP+A==","shasum":"beca4ad23f816d84ad9931f3d14bf73937c7100f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.28-master.20190802190707.tgz","fileCount":323,"unpackedSize":4190920,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRIrUCRA9TVsSAnZWagAARYYP/ik/wcfj/4N8k7hIho+s\n+BSB1Yg3OeelDULlr7ecisx1ePf7DXzLvpOgsCKjdFQf9Sw7SrKOdH9o2KeT\nXafsKYFdimxn/vr/gv8Hu69QefgNKRDpAzoEgPttvKR3sm6epMGTnGR42CCJ\nwcHIb9O+EZGOP2Te4hH+uQ9zS/4piC4M2YRBcZrb9aNzplTCkMMpCSKfQr+e\nNm6lD0bNUugKlXmnnZvE2bmJurUjsG8hYBiwc1UL4BgqvbqK7XgB3fgH3Ty+\noTB0rECBqyZJ4dklESFYi2ORRAwhzr6s3sRrqKy9whwQ0ABpUW+1Vpqllecr\nfYXip/n6wueu3nGWS/qWCvHtWRqE8yO0DrTdVPLQBWwVoitcLyKyPprTrPR0\noMfIpbu4/f5+LzRTL6CqJ6PzUkHEDFZgTF6YyhTez6x0V89iky/BFITOeXQ8\nIjE+0n39jUyfBxeTulECe62DvIdmG6SRrPErltVWYf5Zp7ZDNYguhbuDnMSk\nHmYpLZ7aGnnWLxVJ5IxavjrU7zn46Sflq/axpyZjRBVGEVXsd8r/H8KbiXDL\np0gjJ3CdLVXBT7Od0/Ab4Hz4GFSgwPvHPkQeEgHZsY1g5GNPAQutS45dDyBw\nqJTtAfAQzoU1h40cMnfTBRD5SdFQU1/F3tqcFBgY1LdzlK92OV/oSKeCPGha\n91xa\r\n=jQ3B\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBW+oMkIvnaSOSrdQIkRLisSHhMriLwK6bMzY7v8I7nxAiEAntqdyavE33gWajGxS3H8guHK2x+CS9A1dHdqFfCd+cs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.28-master.20190802190707_1564773075530_0.7581774499804359"},"_hasShrinkwrap":false},"0.1.28-master.20190802220432":{"name":"@atomist/org-visualizer","version":"0.1.28-master.20190802220432","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190802215553","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b2f97cb050de8309be6aa44bea084379f0d31c87","_id":"@atomist/org-visualizer@0.1.28-master.20190802220432","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-GfMQD8CpOzVW8y8xB347JXquxvt/4/VjYA9qzqIwrPewUoZM9a+l7GaV0VXW+5m6LLrYdW/4O/KA0dsbDEvqmA==","shasum":"2913559a7e50ca731a349ed2ebb0dcf3981cd81e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.28-master.20190802220432.tgz","fileCount":323,"unpackedSize":4190926,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRLUFCRA9TVsSAnZWagAAofMP/1lA3WwueIMInU5UbhE9\nD56a8zi7PFHPcnvdy7pPwWkGRyEIibb1luF8sYZIV7DMkOVlaQyiunk25VPp\nZ4sL53+3L7xhtYAH6nx/wzwlKKkwdhlPD5JQdHXvAc2QL/lhd8M021hPgT4W\nhFaFLq1DzIEeWTqMaQmO2LjziyCz0f0Uo60xpz5OKtNqEunviJFIozKUyPsY\nmZaCjOP6fjWEgt1bsWdcfdnvkL3X888IWB2MFnKSrnRY3pR5RSYA5k4Vlmuj\nOh4hUB/P89HHicFKZJ7/Jr5OXB6ARuSNQzbW6IOwojTTq6NTcwRCsUIq/I17\nuomxKMerV0r6Awmzwh+cr9bxpVBpmqJ968X4/KSo4KRCGZ+/Q3239V5VcGzl\nnrKVVoqCL9bnzYpd+ethyk1VqTO3Z0cHZid9Q/uJEu/K+/N3nhuRAVWCioQC\ngPrOOc6xn2pR4BY7AHZBLkmnXRIfopWmsLImXiKcxNshh0T+oXiGP7e+xKku\nfZnArUK5MSkJ+PnJvczmOGnbYpW6VoYZY+xSONL6QoQz2huiaosVYv2U93s/\n2WioARPyHRfCyzLfzMXPL7c6ax8UMzxiqlg7uSq75khXI7/OG3Eud8WZixVl\nUH7+4hARmFAccI7IWT1iRc4H2L/WvMTgbd57ScxrCVZVAwIHBzmGqBjLfLsu\n1ov2\r\n=zuLL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDMqjD24dWEtjZGUX5b1Merdr0lJHFVSHrJKMphQxdbyAiBAId27cSrLVIR8dokafzZJQmB5vjhK3UeLreHxXXxm5w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.28-master.20190802220432_1564783876840_0.051832049388277124"},"_hasShrinkwrap":false},"0.1.28":{"name":"@atomist/org-visualizer","version":"0.1.28","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190802215553","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"gitHead":"3bee8c8b0ed544e3453a2ba994d5143bd579b40f","_id":"@atomist/org-visualizer@0.1.28","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-/FbAljmlSBqBNWP/vdP+REytgDYkP78KU0v6PGNZmvAc9KocGIc29zzWp5vB4ZE2heRnmufBEaR55jV3ptf93Q==","shasum":"4c2992b40061fd7e7ec26f6a516cb7de0444e080","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.28.tgz","fileCount":323,"unpackedSize":4190904,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRLgKCRA9TVsSAnZWagAAL68QAJ1+uFk89qqNlgLGaHwH\nuMhOndU+PcCJTVJoPPLwl6NeBwxSrzwL999MENNYGXvTco+f7zZZ3N9hNbDy\nHuJpcHMBkSg73duSdadrQUKeV18w1YaeBuG3vVcx+DMWty47FFqayijIwmu+\nWhF6s2fP2Ytlr2MGIr280iRE4LG0HfzGx/reALtIIGTWPnFSgZugTVwl4SqL\nyrnA+ZCTv7+XWUAp0JTk9a0OIMCjTaejs+BXjfGUThmNXNVi6d5GpBTMDrfo\niyHLZvDISXYuiE9AKTuXmeE78cVPCeKvgAo/b/3TuC/VjYyZOgdd6JxcN8nq\n0x7QbwRkX5HkKTWA9Rz0o9y2noo0eso1qiZb3vLz8Jeael8KRc8yqYoxtHwN\nD3BV7+dXCdlWL4UySGpeJmKsayqbabYtLQ1gH3NeJVHC1n+TfT5MUHGRAdVe\n76Ea1+kgtXV1oZsN3Kx44SywksC8pgFMrbYjU1ZYIhjgDoizElFvP9af1908\npk7lANicamlRUNdGXggD4AhhdhOZwovKzaLVREe6BbhitGFUHTilkMXVP/w5\n+Qm6DnGPKVCIGxvP5zwVSixTBwfed/MGV0RdSjgDpthgBIgHG3jkKB3UuLxq\njZBj02bpAbL4SrMlFrtGg73DAWWKOFqZYLJ27E5YfkACXIR2y6WB5741ke4L\ngxEy\r\n=vALa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDM/mwxuTwz5Y9UkoqmBNzcskf0sPK6fbtPRmVXc+bajQIgQ8rcCie1aodkIQxzSbbwRLonDNoUVemgXsEIH5SmdIQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.28_1564784649252_0.7253717576450547"},"_hasShrinkwrap":false},"0.1.29-explorer.20190802225521":{"name":"@atomist/org-visualizer","version":"0.1.29-explorer.20190802225521","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190802215553","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"bca512139ed150ae7624c89193dd11ccf7e01312","_id":"@atomist/org-visualizer@0.1.29-explorer.20190802225521","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-migeOF6YuIGy4UMgy5lD2WYvy+RFrRfJA+WZP96NwjNA88fsh1MF/P/+Mv/vvVn+PwfRGK/P+UL9tDiMSE+geQ==","shasum":"af8afa5690e404e6852ddec52b3b15c8dbcb07f8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-explorer.20190802225521.tgz","fileCount":323,"unpackedSize":4206108,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRMDnCRA9TVsSAnZWagAA1oAQAJRyE2Aj3JDPZSt8F98F\nWZfmdODTDuPwpgkuLx9RAnX0p//1zxJVxb2gtp3+xz7enG1QMCWtfih2DTpF\nBmNvjPW8AMwI+pJuiW2LNAdz2vZSNHD52QYphDBDKaI3q7ojF+36aqxsnSVR\nEqtP4OB47wY7g+rDEvf1+20bm/8hoUEQV48pCs4QFey7ziyvqcF7Afshxyqp\nNPASdhJL7HFXRr5pw9HAmK8+LeLbUusZjp/F/1Ns6y8JY0pz5tlq9lXVqXOv\n4gTlshHTQd7qFYk0Sw8g1lwF9lqEhQZ/+juBt674CA3b8hh1tzyc+ShJWtDF\nqot2BskuJRt48LHd6ORdwchh9CKXcTNtOxNHUgku2YlG8qsXxEo/OYrTSPks\nlWvYvaILxQ2NCONyIGrL2GI0A/tPNHbRBtyBVzuQliBxbHeEjo0gnRfoJwns\n1/KNutTlvtKZnp1G6tGWdBb2UY580fdjZyO7MPIQn7Qggd/6jvKRZNpq/yKT\nkiirBF+wrvDk7/jrcTvRsMKEprpZ8M0rq5c90kJv407MPQirG2TopHsVUBa0\nRrycns2YdWs/tT92EcB4ojtMyBAk3+ZzsMdd2h8Azyl1+gZTJKsd+3j/HvvP\ni08Tv6Lb3giz+ZiE5v8Bg5rq373YQhsyOOxi/PLcIxj0NbD+UAsxZXLAPwzY\nX3em\r\n=nFjk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDyA3OlzBEt7mufO0JTiF/CfI0MM7qexIuc3aXomS78aAIgdEZ9RfhITikBwbv+3A9Rehbgw4dzogfa0CoGOlmblaQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-explorer.20190802225521_1564786918963_0.9573470608642733"},"_hasShrinkwrap":false},"0.1.29-explorer.20190803004507":{"name":"@atomist/org-visualizer","version":"0.1.29-explorer.20190803004507","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190802215553","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"dc73d0d5fe49510ad616076987e5607a961200de","_id":"@atomist/org-visualizer@0.1.29-explorer.20190803004507","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-JJcr2IALebye/ewD1rxf9mD2QptDi3wYuUwxv4z4/mNfAVMzbVr/l3ri0Ki6Wnbn3wuXJy4H7WdF8/ZzzMrkIQ==","shasum":"b1590b716efbe21d05a2425ec3a179776987c65d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-explorer.20190803004507.tgz","fileCount":323,"unpackedSize":4211269,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRNsTCRA9TVsSAnZWagAAMeoP/jQl6g8OKKnFSv93SZ0E\nn7FYQlS4D8oOI6YDigkFiYsmxYW8nq4TYVwVTNz2myhiFOPPChdoPWW+X8m0\nvzqqNK5CSY56GxBrjITFk5f+WQE6VEBxAn19jPBXs90msevOHgLFfHycnznc\nKTUV+0Ad1QLdbB4yk/IBgAUfUPEllewvlnJThUq9fpdxcHOSaWpQlYGj+QlT\n1KWin/Hdch6fLXj6ot4yoCeh6ru3/6QT1NpHnmxLzI/wdD4+P25vvoIGMKfa\niBLBGOxkIjruuDtySweyDIOcTMya9ivcnPT8VwTYMYLZaIjeK/5volviytfE\n74AUou+4EemDD8Bgpesnof6xkExbFxev8EVQ1DnLEMw8uWy7SQR9xvuj1+dW\ncaioM4ftpVGy6sLMwKAuXmwkiSCmTBgH/+ZRg0CVJhvGOJF0Cwurrrpj1SBO\nMR4hht5jTFBx5uftw1JYDqq2KaVYrd1Hmi48YrVwqfS7E7EZC3cgKSctcXMv\nIEH2gndNuYNH1Dn5y+6jmjcyS7BF+MUW41ctO3ye6bpHHnqanmiqDeNzSpgJ\nseGDcpUe3XIamnb8A7KHFP61pn9HCzJU0U2hICOeZibQOUzYHw/nJbkGdQ2G\np5WZlxc1FyK+J/qj5w/33ZcyLWrDtS0gwUoOIjySZh8A8fde9cbE2cdXHezz\niC47\r\n=wQaG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC64IO1FrhtWCTeImvDmGkQo0IMvvdPY5rcf3e9KYcW/AIhANHxb03NPP6HyrU2L6m785WBtHePbuYLbqC5ALH+awyx"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-explorer.20190803004507_1564793618758_0.9705466086754535"},"_hasShrinkwrap":false},"0.1.29-master.20190803090726":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190803090726","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190731211703","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190802215553","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9c61641fe3f767dd80bd72ceaa2aafa6a3fdd105","_id":"@atomist/org-visualizer@0.1.29-master.20190803090726","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-pmJsamH6KZoEJxcOCnvAA99/7OCQBII/ZgVFswgVh7uMweQqiMUqin0a53F3NMRt1X7Szv47TnVYJT0mdbZRKw==","shasum":"498a573c510427129b34631302f8f6213bc99d8b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190803090726.tgz","fileCount":323,"unpackedSize":4211292,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRVCaCRA9TVsSAnZWagAAbMUP+gNDzCtw5IWDW9SbtJUf\nXNuWMX0Oh8Ae0N95y9C4fqlF+fahuACDpb0F5j1Fs3+zcu4QEisvNIfZesko\nKz76qG6zENrYPeCnqTAb/txouw+NTU+XdXTrKu02tx2q5PQ7//HOdw/JJ+bC\n6JdblBhPiPh1ecPtoLnw93dluLFBFVrnj/wOa0ADbhbFJkmVk5hqIOQZL6kS\nS7WaYINs8XIIasYw6NIf0sfEZaCiJEazzq3aQ7O97HylVVNPeJceZ6r+aAEE\n22/xaxJAAt+a/sKSDZrEUWAkGX1TWCg32cQBya5phQstkzQB1OWEViUK+Oxx\ndYN06ot1BF5YrySudeVGI3YfqVUErsbjTb+sBvzz07z2/Y/EWpJm1HUVkqcu\n3eF7oCxaSgZ3F22C/culpKaTwAxLhHDCJDwCfHZ5XKKZkQL3Da0rPN0v5VFg\nxMNasEqMgEe0JXZ3niSkw7LWnxa3odPBCJ2GYEfTYg6jpEuO/xR/Ntjf5Otx\nMnMl6dTqnq6VLhor0DtOtNay0WZhpkrDX/SZ3HnMXgpvo/mcsSewLBI7RoFl\nfYBxtOv90ecmt/Pl/UHZXoixAQBuUOeyUBn9BX1stivIa2nGya5PQM2lli53\nOb2ovK4++0Q0qe9riJKqzAzJGU63r3sH0ZEHnbJXhAON3LUubLCppns6QiVW\nj8Pm\r\n=lKR6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAx1VIj0qw7nfe7JPyMde19o1nUaE+DegepWLVZ5RfohAiEAhWHm8QV7NVX4wYgNMhFRe16AOhQ4bC9o+GmLhcM8TmA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190803090726_1564823705998_0.14731379494838825"},"_hasShrinkwrap":false},"0.1.29-master.20190803130000":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190803130000","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"fd1b8e424b1788e675b5f3271632f0c577d1a6f1","_id":"@atomist/org-visualizer@0.1.29-master.20190803130000","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-p75dVvSdoKSFpxccW5rekHw/1Lqfww3YQWF5kbq8UNtRq6j5a2vePJGqMBtqpXUX10H1oPk4yQvR3dUTEZIhPQ==","shasum":"73de7f0e391581c7f9ecb55c327559d2354a74b6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190803130000.tgz","fileCount":323,"unpackedSize":4211292,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRYdXCRA9TVsSAnZWagAA2RUP/29Ro3iIUIBeHFmT/sSC\n55asYY/VnBKj/TPKJ2c+JQNtlGRS/Ff3YTCdPKZ9+s/ywAH03mwN6Juu5h/x\nC5CN6/LS8Bi8kN9Oa2wBvtIGWO0ZMw1xSmzO5iM3A6eSlFbuLoFGbh9uNctC\n0UY5eepj+2G1xfs/VbKFUnBPffjGBM24B/8xjF/9JUZTHfSyYyqq8kIPpD+T\n5QBObrhsND7OdRhcs/lftwTHRA7NMAJ/kUDWib4nQoLGPPGLEfIiVsXLYRZo\nSg4a8HdY5HiJTvzI5yl3CX+lx3dR+A55vrpkf+374kVuqn4AM+e8rM2LVRsM\nQhbUuKQaIdXcMraP4He9fg/IsVOmaO0yLc5A9gBUQPJX+ektWcxSPhchtcn2\ntCm8aj3IzoUFHzPzIfcj2vqJO7hEKknln4VcdoiHgsNSNGMxGilvaizwL95L\nofMs45y8qLr1T7zUGvhjhuSOpNe/+I2jSppYzY57BohltGkDad7ahN1Gjsu+\nCJEci5t+YQr8iXZgAaEutkKHo1RpDEImZ357qZ16XSTWAU4TYPok/H8KuoEj\ndjsHgIBoBUz4kAmx4OIA7LLh+9nqeT8iMmbvkokdFCrbSFndIohGAC0z+jar\njfRNYFu83JVjG32c0D5PofCbvw1sb83pzSYWpE9VfnynbKiPoaeA1YYuXYJy\ntMiv\r\n=/JM8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRifczgmAe7yyv9G8yAt+BHktUrfoH3+D4MDTw4iaHbAIhALYb9yZEUxGawDMF7jS8JyQF7c9wk/c5LsaCG+SyEHvm"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190803130000_1564837718199_0.3554590899472141"},"_hasShrinkwrap":false},"0.1.29-master.20190803152008":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190803152008","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b8a8652c3038b6421f10e4305ffbcf6a936a75e6","_id":"@atomist/org-visualizer@0.1.29-master.20190803152008","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-F4izlDfYe9pegh53CMsqxthILCZSvdwWckSTZ2XkhKWvYEUJLIwMzzlnaMdMJ5LOKOuIEOhAK7v/AMl3JDm+5w==","shasum":"d8a7a97b5596d0b170078b9960ba4a73f873abaa","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190803152008.tgz","fileCount":323,"unpackedSize":4211302,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRab9CRA9TVsSAnZWagAAr8UP/jnAQQWs+ji3f9kXkSB9\nO1s2IQledEe/UhL14wx9GZfbRTULrkUN4zcdoiUHxCb08su5PDH3uz0iMV3X\njfGWPlSVSk14erKlXgbLG8DplpmVo8CIQxjb+M607TC3XeRowfNzzsOmH1Vp\nQz2/Lg/zj+ACBOxApxQzoKOQzZ1wPriLWALUnMaa0T+Jak4+stbM1M7Y8kT/\n5mNlhu/UnWxWJa46zbH2ujlwd7s+WQX+ZXwz2fwJ6AbFK5lVT4n4ox/OW81y\nwqI3U2bOHzJIlJbzMuMMQOC/23Zi/N6+Syr3DHvZ/X+PxgynnWt1dDNwqrNX\nS4cEC0pqJLm5xz3Ez9YjL78ZXsQk8FtxorcZmPf7WhCD1IbfBSKLFs7YQycu\n71am7Cys70Wkjsl8FbSB+4uAWUP+Mi5BakaBMEK6pWxxBOUje8NXz0yNcjZf\ntsy/Umc5cDD9p858MzmvxwVbKVd+vYzUIUxKGbsazf/p5qV71WcwRedVFTWa\n676WkTOCKAkmxBoUH3j3LFv8XJ5S/sCaknrFDITcIjmR5euiqM9LkpSmjP1F\n7PBTCV5m+gkOV6lxmPQpdUxVIApSFLYJZanKiW69+Veu1+uHwhIw3aYyRQPj\n6lFAqoRlBxlgzTiAIUb2CLysmqOaHy7O0xNbKwqGlev0H3LFib1i6ZsWrqNY\nacjh\r\n=7Vu0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEWld2J553ifNLjkkn9CCQ8qaoart1Trczzu08wx0CC9AiEA0sjh9bvdIwXYor4KgeC9BrC3cRu2vCz4Okh3pIU59oY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190803152008_1564845820987_0.3961117832875991"},"_hasShrinkwrap":false},"0.1.29-master.20190803230732":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190803230732","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0a37e0d6542823301aa72758fb1c42fdafd2b233","_id":"@atomist/org-visualizer@0.1.29-master.20190803230732","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-+chLEhHS0Ktexxq72MFj7pPM2VwHMI2B/GUWl0yo0OC9ho2DdYSKviTmvU32LNkfjQZu5MK9az237Ivio8QfoQ==","shasum":"d82ce360a3971e763bceaafd7342997dee5fe122","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190803230732.tgz","fileCount":323,"unpackedSize":4213418,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRhUUCRA9TVsSAnZWagAAOj8P/j6PCu6JFRJI+6d/oq1/\nuwU52WRJ5tS0vzGPHF+bOonCcx+TMG+oaXXK0ZwnSfWHtkUGXMApbGcQg/PV\nyhtk7HNxb1yFVv5ruf99/gZhHekY0ESk5C/cWL2DYi9wPdPWykctKQzv9Sbz\noWsKtrfWBTxFA/+J0pgnx/X6YLVivoQXtakoLpKmrlwMWyRHDjohfnMVusW0\n0hvW+aTpyIxncHrigqxABNVaez/cVPECCyjBF/evuwetMsb5+ILizN1Vtsa6\ntl9HxPiK8ET+rJlVzol2l2pH/rwV51BLUU9iQpUI0z6EHnezI55szp000sLT\nGSa65S5PqOtVoAYi1/OVJkIf6pPQ9zEx+qo7QOfoT0pAoxWh2m9V9dpinUaf\nymy1Qk1Ge33P9XjeoCxCQTSSG182C5+pEczUYSgX5WRbWm7G22y1jFUFFzuS\nK2BOy67JBw8dHwLGY0BdFyddqY1oBaXqEKZl9uJxbDCzRHJD7Fh/+UnX+NqR\nZc3iRlRcGVEV2fHHGEymQu6dqtVIOvD86U5rtIyWXh/5ot275iXBF0Rx5lVN\n2e55X5T6QwBTxiV8zg2uBNL/FGUY9hc/ApVDGY4TI96alsZd+0OIDYo8O/k4\nJ5JEdQN5ZTVkVdOKTJKAplaQuXpz54UasqQa6thrik361opFJryC8XH8fn72\nPmP6\r\n=VAZm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICBhltIzPgQ8qG9rMJ20w8LRGxzDQJl22NLLC+y5wpcnAiEAynA+hOgVwN4fb44DZkgzg6sDzFMpvjKA+ZxYPd7Y0Ao="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190803230732_1564874003304_0.4934549457937061"},"_hasShrinkwrap":false},"0.1.29-explore-ui.20190804013840":{"name":"@atomist/org-visualizer","version":"0.1.29-explore-ui.20190804013840","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a961ca0bf856effb295bd07c6b5891eaa7c04d82","_id":"@atomist/org-visualizer@0.1.29-explore-ui.20190804013840","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-D6koFF5DF6pDwLDe+y565PU5nJUC9DV7O/iVIpB+LRYA57X6cF9eugsX0aokA9ps078oj3MTSb5g2OLnr1+N6A==","shasum":"ed52e7dd5decc36ab23cb309561006b09d4a06f0","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-explore-ui.20190804013840.tgz","fileCount":325,"unpackedSize":4225484,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRjiLCRA9TVsSAnZWagAAnkkP+gLviB1ps/3F1oMwjbaW\n6aAOvqWHIXAcBzf5nnGn7lrcwJICwVLE+oUs1eyUCjSrVr6EYiKbChQaRcU6\nlMrgu0XZEE53ogNawALYK8JBf+7mY5qNcN+M8+6uVXmJlPBkeUL9PIsJ+YwZ\npwWzyO2Xsq/guQ7mP1/oNK4SOTxbTbncRIyplUEhpBYwPRIlq5MMfQIetXMd\n2Es+G4Ky9t7z0TD5qVQlWl9j3ZV18WXsQlEoAHa7akpa1bxv1+R/tTGxrc7U\nhdw42JC4b+eHqxA/uMdGbGM8ErB65xEcrMX1DGVWMoxqU3iVIv77edxptI7a\nJPfE1aEHUCZJz1HKRjQbcQWie/PAcKDtMlUE56WInhaMvLhWh/FLmzqtHQUx\ncDh8JqGEoRym6XOA6yQvq4k1PWPqBB+RFEnqy/H4d1biVL/YwzCxBtBV7S7s\n26lINIVCn/eTdoe2s4MAPSbM5/DxfNVVXROGovpGKhY9IhcJOp+hUvwGRngN\n9gxc2oXJUJAVpi/tG1Iwj09yhtZ+vREJBMs1TKVxVU7mWpU5DLo2o4qYuaM8\nci65lHtkhD90JnzWJaRiYsQwAhqCQoav5FUonZKX3rhJRF9ApkaoeCprxlCw\nr+sdZJQ9T6NeGO0C6PlWU1tLrSba32Y1TplpoLxw2Ui5GEigQBLiYjli9fXM\nm5/K\r\n=hBm/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICHGjw/t0JpJJG8b6bI7d7IyvLRlIIOKiid7+pfpdIWbAiEAqL/s+NlTrMhDWlS4NBgOU29SCdG1whQK5sn3iKJqBOE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-explore-ui.20190804013840_1564883082607_0.43929372291272295"},"_hasShrinkwrap":false},"0.1.29-master.20190804094502":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190804094502","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"721a390bd8b36d3b0e2efb72278574875d5718db","_id":"@atomist/org-visualizer@0.1.29-master.20190804094502","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-euwIKd2jWchwp5tt29ehDIULzmimNvGn/PowlxaM0B1m9XeOrW/0CdBItV9Q9TtXekOyNyuKpXBEmAKD732GJA==","shasum":"e0db3d62e38d2b47e6e7c99b21c44d18f967e267","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190804094502.tgz","fileCount":323,"unpackedSize":4212614,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRqqqCRA9TVsSAnZWagAA5qYQAILvTE0hTMEBqkCWRoRn\nZhADfhJApT7loqZ0uOL96irrggEzSYp7ib5P9uzhbVmGpAyuWbDy5yEGcBnl\nIUOAfLreeOORh/wccCpl6L6RjOQ/eNBwqE7xpNzmfl3i8AQBktUlPrCHg7mG\ncZONP1ilA+LkF/MMF4xrmBiu+EKI7AC4vPPGUlffxvJrV/scMJADKUaVDyaR\n4WGmdkYHHHn8zGhQbvO1Oh/e1aHbL+J/myIUfGVeFwlxpbJyqeya5YXYaSSm\n7pIHA5lN2/la+e7zxu908dC7d9JNvq9QtYC/GbOEZRE3h8mcIZzNg9dnMsde\nN5+t/zapl8LNFiACeQE2d974wCYPlGWhEQ+Ib6qov9CPZsn+setGoDEYARe/\nMEl2hELfT57THX9GIKdhNpizMqsr8juNgNbFMpRsdD+chnAi9D/IoApPfdce\nmAcwyCAdhytMDj0AHzfzn6Nd5ydIAXKJ+FsVW3KyG6qlgVaJZKGFinpB1+aN\nk7UsESeVUBzz2Q5M8CW8kl3LuTboTEdrgmbgQ++rWh54L9+ssU3Cs5PnVwE2\nn+wqXTRZrg2m5pWN670hQycKkj9MSUf8qIUGyssFTdLRJz9R2yu3nf9p1lES\nC/3Sc2MXUmUidfemc1NvIikUImi4Eo5ShwkkafKyT2sWoKRsCWFSqHiRPcez\nLZ0S\r\n=DDrg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCOO1ozCA9QppX+Tup/I7c+ANPHGQWJq5qYbmMoi0qeBAIgeIuIQ7I7QeXb3pouxTb6eZPHRDbeelmM2kGdZYeKnaQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190804094502_1564912297480_0.04249648649862103"},"_hasShrinkwrap":false},"0.1.29-master.20190804095736":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190804095736","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0d426e80bb3486822c2ecbbe827c0d50be5af0f9","_id":"@atomist/org-visualizer@0.1.29-master.20190804095736","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-HxcE8A/SZUtaWumepdUXmHNQryLrXFCwF3URK8ya+U/CNVqfIeXqtqNhGYULooCqBaSuFsfUB4GhDj9I1eZ9pg==","shasum":"88269b289e070b8a65e81547e182f2ba638f8aa4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190804095736.tgz","fileCount":323,"unpackedSize":4213174,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRq1hCRA9TVsSAnZWagAAca4P/0cLKDl09BTf3FWSHzXa\n2hYWIINpyXDZb+yzkrVd5Ui+yR9Uk4D+9XcEcc54DE+DOR1JzfiZ+5mRE728\neVhAaEiz/7n2Iky/n4dtbcQg+llx1LKgnD5mfEilhGR8JrfMkF2XRW64MOQf\nM0zUJhUxtIAX7fNtQHxkKIh2YLagTifcjJ3jyvIwLQMgCkpyP8ooZNOaiOB8\naLG23kBGbVkwByZ9ppUB4zXLEpV0KMzdP597HddQxwiDzbPR90wie0OKxxMo\n8+WFlLKPX+9CUfNL09d/SHNBl71mHbZ8qzKDrYcZivxPjUOsa13Pk9zpndk/\nT8spZSxjyqqHQD031p+gQlwRO3xvXPq/fAAPIBEBD5LbX2m2x6utx/hSq9bG\na+6NoP2+UeZRiYuB3m9IvkprWXkrLMfWRtOmbpspvkZYPibyTNidG5dHa0LZ\nPLsnbRy1hdtp33+C53CctIjYKic1Cpi2VO5dxp2H3ff2znHBvTw0rUnV7Ix3\nazEEl5tyObwvcjebZX+DxWVtCH50Z9fkOEmEWXS+pgJFIErhS8zACQBaZYUq\n6R1fY09jgEDqEjwGtHsjFv8IsBVaoLqDFhi551w6NFWm9INvky5KBamtrIJj\n0dvGgdWp1jR17OMmIWrqCd87nzXZWzUrMPpqg1xZiFE1hWAMUzcqmi+d/Ijg\np1D1\r\n=F4tu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBvPuVb3bQLQAvNJQKd93lMFOPdKchohR3vwy4EQ2t1IAiEAvKK6chFtD6WfBe3gkTLVwMtdUAR+9hoqs67aDEXYWMY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190804095736_1564912993141_0.8317151213665841"},"_hasShrinkwrap":false},"0.1.29-explore-ui.20190804185527":{"name":"@atomist/org-visualizer","version":"0.1.29-explore-ui.20190804185527","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ee9328862b7b0152f9cf2dda40e02ede8dfe0749","_id":"@atomist/org-visualizer@0.1.29-explore-ui.20190804185527","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Y5Ogk8W/gZXCGlSFu24Qc9uVbHvJtDHshteCklo/tYQhsfkq96Y3DuR40sHzbqvUH1w9S0gZvdydMWhMerEn3A==","shasum":"fee73a9a91f618d97abbcacc59492135df078b75","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-explore-ui.20190804185527.tgz","fileCount":325,"unpackedSize":4223850,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRytyCRA9TVsSAnZWagAA3vMP/ilFOFea8RobOYnr8K4I\nPYCzq6QVfAuLNnb8NcHPLjiK7LdvH/02Lc1Ee6oq9FSulk8+E4i4DZqktSNl\nbGj7MJn92dyXQtpkqzO0OEez7AOYe5C8Ci2AeBtt3WiiGnSr+0eZadu5Ic9m\ngvHNeDnPnuecZpI1XVX8pfnPBSMJUu97CEJnnEmJvx5O5WC3iv7iHeDmOG06\nWUP8jWeaeLaMtB5/lNGeqKZf8oJeA+GUSdCe4CttUbkr2NnuP1FnjG23myzE\nSy9dTbxEh4a1sGY2yPkrn4thbXOKviB7LUE6qsQuMC7wv0TwoSyrFQBLOH3/\nzCYFxJ5xAMTxRkgniV69JJI8HW5kPAI8K4LLyxm+p9dvtouc7+z6WfV4gQQy\ncSBnxmc8wdYu0a7COpEdwSwKHjoj04HoTTW/1ShiNQzbugLvs7gPFoeLtPqJ\nx6yLe43yUXzKmPrZjB/rFJJZjmPD7FA/HVzyX9+11VtRDlOYf4etO148xfdF\nBZLA1xiNi8BVaEKvqScAxpNZKgwHyTmT99uUI7ygfBX/lwZBTbkx7fNL4HYU\nAen6uQw7EtHK2TwYzo5ezRFzKzmhXqSKMXSmvVd6v3BdpU3NDnoqVhcfaolD\nuWpdM11ABlsVARPmaDgd/uHy4Mer5qen4ZZExYS+z42XmaTAvA5ygVpuMwp+\nlWo8\r\n=o0HO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCyOkuyrbICVld08aQS3iDDAvmzj+4Q6NMrFH7BrPWJjAIgJVX0QeDXi14QUwGWz+IfOqBuV2QbqiPtYD3URCi1NE0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-explore-ui.20190804185527_1564945265358_0.060906851819617414"},"_hasShrinkwrap":false},"0.1.29-explore-ui.20190804190600":{"name":"@atomist/org-visualizer","version":"0.1.29-explore-ui.20190804190600","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"189fa0c594be9f0d0697de663d432da59688593d","_id":"@atomist/org-visualizer@0.1.29-explore-ui.20190804190600","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-5ZxBbbe5ZtXCGOGI6add99eTVEzmbV1KeqBAK6Jg9VxFby8c62Aq/DKhsAshkyvfuqciASRHYuomkznKwHpGfA==","shasum":"98e307a1e3827c418ffa752d24bb3a14e53617ca","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-explore-ui.20190804190600.tgz","fileCount":325,"unpackedSize":4225722,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdRy3pCRA9TVsSAnZWagAACREP/j3LYgN22Zyg3h02hJT+\nDBTCxsMLFXBjBtJLxN458IiyLhNuOcW76DMeGaMo+Whl4GlPMhhI9f3dPWbb\nuO9BPCe8txq4wzu4mt6Pndv2kEiaSlAAZYeOd4h++qwQzF1GERrTFqNQeNqE\naVFQ55d/oxt0mqcad0oSm4h4HXrP8yoTqm2X0X4ovOmhmJqwf2gDl8bLrgPR\n2iBOIs2uj1LnPlgY0UmHsSIU1phmXJe/oGJVrpoQxQmPKxzZRE4R+DycNZn/\nuXK519jsj9tJgVrvJToyyfFMya/6BrTUFRCk4zD+Ftlp1k8n7cOiRnRE9Wpz\nUKD8Dt9IWWJhVDDXctd77/0layftUUGCKZZdUsSC/SZWg8Ls5MkTF9qw+IrO\nwiXMBD+DkuiMYHJHZT9vasr7MFAU3oxFPJ5fbRrrHvrBZ4eYKOkZaWxLInpb\nstcbXf7JY7pP8m2LYouCg0mnZfuc0t8f/guVwAXJh9PGzSeTfqRlYiAaQsGR\nige3rsWQS7lMog2TystCuo/Qnjl1aAJr9CJ1CfOrDyBZR05kQQhgYqLcFwVc\n93pkA5hloiBSuttxEUk700DbjuGSbsxEEhvHPM9cNBIHi+iZFD8C+63eCGRH\nlNjx70xG20vu1ryPR8IJ4H7T5W9ShGzlIqNmi8iESb7iYRmAhGH7MJg01x6w\n8OgQ\r\n=23xP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIALx04A0OZpRAHyjODQlvH/IJlV3dapWBDtf2EJD97jYAiB6FJHXX+h8GY50luc4LrcyCCGksk7f9qzbbAXIZmkB7Q=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-explore-ui.20190804190600_1564945896690_0.699556492119769"},"_hasShrinkwrap":false},"0.1.29-master.20190804222013":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190804222013","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"96978bf5198ad1d9ab5060390f4e26a1feb62a0f","_id":"@atomist/org-visualizer@0.1.29-master.20190804222013","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-wEez8Dvqe15/8EXBmzauVUsX7SEJtryEKR0pdzABUF1CgpKmKeEHWRSTqDDRPxmH/FVc4OHz+5P8j3av921LmA==","shasum":"021c7c2ce3932c06e3d12fa7e69352643d16cda2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190804222013.tgz","fileCount":325,"unpackedSize":4225714,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdR1sLCRA9TVsSAnZWagAAxfwP/jWs+x0YqWohIzxflSJw\nBekvyBPILF2JYm8wY7LmjSJ8eR3U4C/uLx5xW9JwAB8c4BHAWR4oCe4/7XrS\nfUNziNmgFUi7ixPCszzO4W/sMfwWVIWF/vYt/8xpSx+x8/2e1121OWcE6sjN\n8slu7MQ2/enos7P0BdKSxz09WHzVqG/+HvW/M7aKcfzueRk4eG3HaktqptTh\nOMvt1sGsDnjsG0tMf7jaCHGZ8yxpG1y/CvML0LuPfmdE76LJlv8pe+VUvP3Q\nS9cv335vvm4RHKcZEKmRfvKIpRhr/NzNFa2DlzWPA63KMe2fkkw33GCBpnl8\nomrq7qvSzMqkd7g679FL+9TXkoDRN/Zx0v8Npxrw7ETYQQG0smaD3aQhvoP6\nJoA/fZSkCylpFSigK1WReMsPOjsCJ1zYHYEQSqVU9UaLuxXtZ9ia35+hSvOr\ncIknc8bhv1CtSa7Uwaxq9djhdxvZPZ0+Tgqmpq7z/HExND1cL82YSbk4YPdI\nwcCUYGje4e4+e+q7909ythovaWDso2cgF6HT5l7yJpQjuQd+bM8tp5bdsVjY\nXFbhIvRP1nbDdgB7mGfz/MxXM5Ii/MnEFTkyfhaQfbCILF8T/rw/O3uJzcYB\nP8CUM/M7Ia8lEFd06vAMna8OuvunuuUz/kfwjSpr4PjykxEoU5lIONkxiaE2\niMOT\r\n=QRT4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEpT+AE3OquXz8Cc4hJVZeV27qkHFRa7RcZJbyoWHTeeAiAuUV+NK8jYw6QdkK9QyFBDNcMkHbGB9ymKDuKiiCcAfQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190804222013_1564957450876_0.2945773839418999"},"_hasShrinkwrap":false},"0.1.29-master.20190805035234":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190805035234","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b066bc180a22b2f937554db7e3d70618baa3ef5c","_id":"@atomist/org-visualizer@0.1.29-master.20190805035234","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-beK9l7LMnj7DTQUfN+5F7cyyyYUHZh7S8lLT7A+UPy3xSVJLV1tr5VHsjgoc9izEbKrQpBoMzom/A1bPaB7JvA==","shasum":"9ed3e9ea76edebdc3620eac5ec6e38dcdc38cd92","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190805035234.tgz","fileCount":325,"unpackedSize":4228648,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdR6lDCRA9TVsSAnZWagAAqMcP/R2ma22p8o8L+yq0CiZF\nsn3gC+pATrh3trpzH/Cw8VYwKJQeSNZxoN6k5gK4Zbj2SbYfKrgyfiwrEhz1\nYB8hB7C8njcOPhlIXDXtectuRo2iYUbuQY7KYssGnEEfV8jNcGy8TTkiy0v5\noTQZXY0loVwNRG6e8CXmp6Pyrf0ge+9kOVbt/bnui/abBOz1bWecBbfqsPny\nNGjmylwtwS+VBR2B0T/idyFUOAbc8ltGJDdEWsa47eSsnhisUbtab8kx2M8b\nI5M4pz163wy7GYfj6klYGSHBrg63J+4SclbNI5Aa4YOfDstV4Km8uREkG8yA\ntwvd+LDiImP6xVmk6SBc9lPqYQl1Nwp/4ZuiGhkEK9mEq7XZOac2l6546vBK\nrpn0jhnqi8RDA07S/nJeUQNdoGhYva6OROTquaafq4x/rp/FapBfhpTOY5wT\n8YTjrwlrE4wRBh7bcC1/bYkylAoXWyQF2W3hkS7iMruXnac7qs2En1FuL2dC\n89wvTKhpxrSuG4xTQKX8esHkCfu3aKzfRBUAM/OCRptR2/DJjFSN5ZSIutJu\nPixRR70iQLP4mGE5JmWd0JjdF9ttRt/1SuZXxO4CKXqBsWApmAyqyqbVyop1\nW6POaSn9JfQH9yHNRA9QZtn7Rc5SxYW9ZLfhD/fHc62KoWYVhL7/32+hycW7\nDWds\r\n=cD9l\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDmzsVyOqyx0pgNPIPo4hCT6JCQjfXmdYEfzUoj6cfG0QIhAPiiJ+Ai2JN8QxSF/DHaWcx5jdtdHbphl8SZucHaKKL3"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190805035234_1564977475178_0.9669512945772756"},"_hasShrinkwrap":false},"0.1.29-master.20190805041448":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190805041448","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"bcf46e55656520f76c7ab15801617a1c5634bb07","_id":"@atomist/org-visualizer@0.1.29-master.20190805041448","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-i/3FmjUssj4owl51WLSD0C76vQ7V0ctD6fP+bGpT/PuU1vi1N+mLtZoXtmGbsxINpiL+rRa9ax5MRvinQora3A==","shasum":"6b81b43134843850a6311b6b6ddfe232da223841","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190805041448.tgz","fileCount":325,"unpackedSize":4229216,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdR66fCRA9TVsSAnZWagAA9LEQAIPQVUJJtWjso8ecXJiI\n1EXReEmlWF6oXheXJV8RCCntgjBqFmcGcFnTJWH8WDs6ZdyJLsYyPKRd7DEh\nj9XuIBRwckZ0nxRAwcedQF92hEzSJT5n7bAZPnTZNtcRP1Rv/1uEzBkFp2z/\nWFIbBq8Y0s2+msUFplTwdZjsmK4LNU4uGotfSnFftGMUvbk7P9oGMBUymHju\nEGuvXK90wFeyOI7wZw2pv1prqY6IIqXW57gTH0osufFZG1DuGwPdb6Cpul07\nJmCt08wFhf6y0nIqHg8IPR2zn6f7jiOoTsWvoUikKF6mqlrJEZsRYlv19NCb\n278ohGmTSmve2+4p07YZS1lwnOrR+uO/C4UomyJfWPimsSMJHdT/KJPXJSf8\nvx5tSU3asBz/zohQZL0Xc/WMRt5jqRvNRAfefHXRKQ3kgGvAIpI4f9YxsxeM\nHQpJvkJ+8LJp6sYCEqD4o1xVrrfkf7gQYH6dGHT49UKk8i75/63YL0UebKG3\n2ukQ5llI+RpLWUCBZIyxI/TnHH2Kw23371YsXMgPxb1EIsMYyRpS8taxOXlJ\nbzzlRI12nNe0DAh13zwp4JU72GUACACHSZ2TOQPvsAHQSTMEC2hwjEJw3047\n4J/dtjPWk9wi1PJHZHLwZjobiaLtdxYDSMZkc2YbmVcwzfkcyl//Yx3PcwwM\nSHJe\r\n=DIUK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCPwQQmq4qZZr8rUBoxUpXZvHg3rGGrlvQKMSFNqD3cGAIgPdNTrLgoipnxUQI8mJ8hANTrP0W1BnOnH/SFr65ajt8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190805041448_1564978847203_0.8566931909037812"},"_hasShrinkwrap":false},"0.1.29-master.20190805063256":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190805063256","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"28cc06408ae33a9d2bacdd86793a526508ce3637","_id":"@atomist/org-visualizer@0.1.29-master.20190805063256","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-UzTW3SpU8wOnUtMfAyhmo5wjpKk0D4+w3zE8Zo3uE4lq8L1bOJrtCtRixGRx96BXhVyBx3pQXej8aVa3M7eSdw==","shasum":"26c27ca66b794e532e20c4dba73a1c252062589b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190805063256.tgz","fileCount":326,"unpackedSize":4233937,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdR87RCRA9TVsSAnZWagAA/kEP/1xtRI7gN79s/WMKjpND\nYvsZbuTZtE42LFqk9m04hyaOOmCqJQhg2khETQbUElDMEIs9+0YRNSdifQ1I\na4SOePTTx2ZZO5+HahYnfhu1SKHdjbNeRgUAvlwxwvMqTpbozuxKdJst+Ivz\nn0dQoAzdhLGozCmIPE995jaIhPKqrgxRgi96tJMudovxKc+BR1ZkfxUhGkLK\nyLxiYrRaAoLPSpyH5CEN55cOsEXCAqiO83FHA3XVc0GZK1O3pMHCpWJKgkjj\nv9R3F4EpHfM5YnBisikOXKupTzVFfI9RPMTg1bJQJoqH7jXbDxLQWmNoYvbm\niARVWX1etH37R8kzjXdAKbUZP+ctJby1YbBy5yp8fARAupDaePZr0+Xoe4oH\nXQflxWzqxO7hoRgDd5hOn0zHm3MosCxoPH1hAasfSNsEDIkIT+Wf38rElYoj\nvJSdbmErpYCoc44h7P/J4jVBtPF2or5/JJT+U9JDPc14NfHHK8C4Kc3YlfMF\nGw1/wpoDVirl+4BvalWuAVIkSI2Ry7pR6REFpJ73wVYNPhueq1cb4A3iojd4\n2/6hBJ1pIpDa4Ykm9/QjSkmt6TbRsZtpzMS3fQxIKxcyuedww5CqPlCRIP6Y\nH0IDe2losONqO8/mzWMnt4drJKMAQigfV9zBXmuIcWplpxi7n7d1cc6mhb0y\na6SO\r\n=pqOX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGDuVRAHOOo7459gRcASbmUjItj4x+oTkBUVoIqzpUodAiEAjE4slqXbS+GY2EvpHmYYsANoBD4nOqze6qVfx3IBqXs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190805063256_1564987089081_0.24147670430145585"},"_hasShrinkwrap":false},"0.1.29-master.20190806042350":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190806042350","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e7b6ca33689ec4d0288995e250ec9c3490319612","_id":"@atomist/org-visualizer@0.1.29-master.20190806042350","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7/gvaQ1lJ4H1tENOXJIPCVqQwE0YEA1Z6UbJCdlu9OMuH7+ztNnr53SqW7bZWBkatV9NaPwYFre6MSOK98pxEg==","shasum":"a0c24dbc44e7182565610f905c5f9aabc6aa9638","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190806042350.tgz","fileCount":323,"unpackedSize":4233460,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSQJRCRA9TVsSAnZWagAAvqwP/3HXvA7perFpTIK3AWMT\nrM9Uo+Ca9+kCIssnXGWcu+7pot9xnh/dECO4eopxHTYZqRSFjHFMZLqxvy6+\nh6Ig0mvjoWBFliKXuPybZIynDW8Q6b4V/J1u0bSsOHndWeLNW+zFwh6bkten\nVJuRH6VQhfA/DWkk5YF0O1U6gGvU7UAHl4att4OTYCmJebLiBHOVDObB+l5N\nxVKRtn+gtPfivVmui34PwefTPI9XEEjg6f1OpjcVEeeg+i1tN6ohokSsnN8m\nSdkrSiWOTo28+UMn72YdCSFBeOxHBYYiGnK2LRElvqzJuR8lKcpwMGrau4QK\naP0MqxCUeT61bYvjUc/73dHgezou7HcgKkOeQyvRnIiI6HzWBQPSGpTsgyDw\nGf9+jiI8WpK+1ZZOj+dyzwaeMQ3a8VuqK/yP8t+7BJW3MgD20SVW5P40YFif\njpoVfRcf79T2KOQ561nvkG5qxdNQ+M970m1FkjsYoR/+rfGvIS5W2hEUW8HE\n7bb+WL0b8Kv59eiHIStlJFYlmBtO34Fir5ECCDyfrKwxxP3t68bx3M+tCK3X\nD/jg/PsY2MUdpSWyHk5WEbmNuseVDKU5MbYDbFGo2xVKdSlu7p3+LvPu6Hnn\nFPmZpgoLqJvF+zR0SUeSq0BcgmJ+APTBtWT1+PKf0hKA7MQiOm/gdhF38ZJm\nqp/V\r\n=GNQ/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCs8nBwrqEY2GArSW7tBl+ClLsne8mPpdUKKd/E85MXCgIhAKi+GbcTz0RypVOficU2PIxBBWjMbnGBPEcIjX2fP+i/"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190806042350_1565065809055_0.2905155738001428"},"_hasShrinkwrap":false},"0.1.29-master.20190806043048":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190806043048","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"abf9ef7b32b4f898a393dbd44e3b0871a8cef43f","_id":"@atomist/org-visualizer@0.1.29-master.20190806043048","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Tp8HuhZb6CjDVyRgJcGMzJdpfFDKKueEsSSGTHk4xAOHrBe+pUWBtdh9VWmtAQM4QDxW79rQnbkee1jFoOvj/A==","shasum":"9a8e20e818c1864e00aa5076477cacbfc6932a54","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190806043048.tgz","fileCount":323,"unpackedSize":4233665,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSQPPCRA9TVsSAnZWagAAbOYP/2Bt8artDtJ/TUwGaT0H\n1yzF4YeA9Ny4D5V/0jtU3AbWIuyAKnjIBcvcy3GG64Oc70aTH5fefPZPvGd+\nlnDwiqU7YxespYGVsTSgdCRAnDq63AMi95JZhBTKTr46j9NLoc8ymNSRwWgZ\nIwXqZD58EiZfozU/roXohzQ9ki9f70mfAHZ0Px8NBOVqTHpqr5tqFOaJV/07\nVb/fx5GeY3NhizYmS74jdRKJYd6n+AdXORPEWzLkuRyJnlUWOEgRIIYW+piG\nOTfF63M7xGqLB3XKfDYaOJfxWWqPwsdFD06BV6cIhkYBQw+mGftf7Y1kG/DZ\nD/K8rmUDOy9yMAus3xsQV+TmipDyXx8mHKeA78r2IED22zb26ZkdKMTUConv\n6q/Ij6ykt9mCKz6w4gyp7S+Oy4rWUVGlaj/fJLBIwam7GQ5DJ/t6/2tPYGpe\noHoZ5SCsKDlYZpWnhDRKTdjlXvzyTZJWBFv4KGIT3nnbkN32Mq4AnY1IeXgF\n0CurnlcskmO/SQP2IlZfUEJiTPCu0UVZhvHH44nPmlhsnMOaheOYchdap6CJ\nidcc8oJayetD8qIuFKsdRx/RcfM0wFEXtfF76bVgI9x3jIgMpeZbZIR+2kCF\naxgh2RiCAZKVDD+FFPkdPpITVd6oTss3ar1LxMbw81XOGwuTeGU3x5lT4MVe\nwMe7\r\n=WZZx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvn8aappH6DJHhJhtH4kT0gO46lQ5CfyUaWZgYm/Qu/gIhAJW5sAcTtM6gQ5m2h9pWuE2FW/emMszOXPRdkBHLByT6"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190806043048_1565066191098_0.23162929379663777"},"_hasShrinkwrap":false},"0.1.29-master.20190806055528":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190806055528","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b9d76ab99af38bdd364e245aeef1a05a442d601b","_id":"@atomist/org-visualizer@0.1.29-master.20190806055528","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ANZcioYtvR2zlI3xjIiC3wYHKcERRDhTiRJiPMkh/IQbuBgeIiDmzoaj8Q5Gydlh0cfmKP/+cOqC+82Vc3A1CQ==","shasum":"91d3c115f54540a46eabda9509dc10d121ce18a1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190806055528.tgz","fileCount":323,"unpackedSize":4236803,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSRdsCRA9TVsSAnZWagAAOA8P/A1HPn+myU9U3LmjioFY\nduLiYfS/5LvqvmkkCxFszwqqJ41CgK8/4/7HcvkoLdsa62T/LCBNbHktt92/\npZvkaY1ZMGqPc9SMrAZsGy78DXk8kos+nSOUvbgNvfvH1dND9haFKDPM/i+p\n2LCIPJnR3FP76hH9uwydeejbfzZGBlhuZkZGu3FhrueFeLaXT39hwccENr3y\n4zk4ojXwYau7b3i0sfUNdsbCY7jGBstjqy5yAN1XI4yELpBqTDhWwEQoCh80\nUozlqkkw4jD2zat8xcXbCT/5jgvzt8go3AqUF0hSgPVAWPAPqQ9YIgmIQ/75\nvap0Cx/NTcX2xvaDdq8eUj4htT2dMnXcIFLHnjX6r7ySXMiOGQsg3gbBwbWF\nm6Vp9H4WEu6Hk548vjRqw+gVYCfCHszmi+PFMwMj4J64xbfZbV4l0TSxGH3z\nsIiioPO0CQ5rBuq0ZNe9on9qMI7j8pHv2pfugsZnOyCmszrvRU5GrBSHmkDM\nOrJaBcWXvFjepLJN1AlN+fOI733/fWBeZ2nP7LJU1391lqzo/a91uctKLosL\nSZlNhiRq26TVrh2EaWc1M2CPMp8nuNo6t0XRPcvSYm3SY4xAYxZU3VGbypPG\nD/Tk6fYrW3e/6+C/D9xyXGpL3Gsz0SYQknqNJbP5TZiheOBqjrjnk2AD7OZB\nB59M\r\n=ymi3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCcwT1VWEioXxBHxnHQNXVKpm5O7MtVziUb3BUx69jB9gIgbLDcGqyHuETU8/bLqoxIgE3dzuhahRiBIo46vjNDFGA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190806055528_1565071211817_0.9058711904371284"},"_hasShrinkwrap":false},"0.1.29-master.20190806070238":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190806070238","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"42cc0b682992cf2d7c4e1b1b7fae62fba982175c","_id":"@atomist/org-visualizer@0.1.29-master.20190806070238","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ziIg4iCiK2iqpEc4JBPrlqjLV7YeXoQpN3VsMaNIvkFxwNXG9OE9RKvX+mMGgD0ZhMLGqyA9e1zK3hR1/MvGSw==","shasum":"d49ed1729378b2a3011c8042c2c080f737c96da9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190806070238.tgz","fileCount":323,"unpackedSize":4236729,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSSbKCRA9TVsSAnZWagAAPYMQAIeyRYCzI7JxHcanMjVD\nvysgXsUvauW7OqJKbO5KZsY+m5aW09llewrS2oMnBWID0E3Y8DUQksi5Y503\nfYmnbBQouUmfmC2MjmcIGtyAzWHzHmX5FOp7yvaXYhaiVYMLFd+CktQY2rSJ\nwy1zhhcRDt/FPruBB9ljbw20DIJroHq7OwrsFVYyShqJgRE5XqET7P6rzKGm\nrh9HZwnhR/IGdyozgwilEHC9i1QPgCA+AK+WvhLDNfgn67DFGPug03LFwSMz\ne/bf+1uWSmNm3OSZKJch7ieBs4UaeLI2vdfdBjZky1KzGhOMoECDy4g/SxxB\n3uN9BuFiCcOCWPFvNlxEm4NzCtfHZ8QzBFO5YZpc/yGbhCBo3BSCFKv9+iV0\nMIS69u8qZB7Sw5GhnYEk4SzrAH8ohOUz6NsWKdRBFmPScP8NELwlwLTNds/r\nULb/F7PQ+a+esnQoF0TAfPQT2IMdjj0iENkZcIUcWcftc/MiEfeicLVoMnSu\nq2L0GtSVIHZ6DZOFUxxioaYGPamkZwTYu4ERvxkLcehFgVHgCiEDtMWWSwB2\ntD2VGgH/bzTOBAj2u8jJMq1n+26VEApnzVculp6S73WWnfBXnwgkVK31tTJZ\nLVW09C7Ye62QOQC31he1G4H/S/9rz3AIr7GQoqdcZXso2OdtihFa/AOTUgdj\nJqiU\r\n=jJfT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDu7rNNDhXdQJkT5N/SEJq0X+GPC5zI+ZpX4ZgOZfDO1wIge81hrpeTqpe2FUqiJSvIGHgWa1+tU9bqbDcMfE3gkgg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190806070238_1565075145941_0.6728871661155591"},"_hasShrinkwrap":false},"0.1.29-master.20190806072705":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190806072705","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b903ec63b437bec431c7d1f6a94438b5ae306c50","_id":"@atomist/org-visualizer@0.1.29-master.20190806072705","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-aiS7k7BeVLdNLXpXYqagSz2/bkSNn1VElaa09keQg9bjeu604L7xjrvQh+iBk0dP2zJHgb5oTArW1UWU5xwqCA==","shasum":"8d73ebf9d2b348e4786ed4614356972354bdded3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190806072705.tgz","fileCount":323,"unpackedSize":4239864,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSS1DCRA9TVsSAnZWagAAeUQP/jCGKX4rAUlmqy3aLeah\nwoa1fJYNlbHI7bO06IOfmLkUaDZm5u42SgmYbRN/oBayEfHlQhUjNqe+y613\nOl6N5ayIEYsOqkjhXUk7e7qD6BE3D6ukkkwExs0OTMCrWKXV83sDbqAIgDG1\nxVSMldJcyIZ20sC96WZu8P9YUYnqIfiJS4CUrm5GhRan9P7ezRdKowVSBknW\nokPriXeD3tkcc/vgkzI980uyjONgDakNrteXcctYsvor9KhwPuwVtgG5mGc/\n7oFTqXtrVqeJuQejjfhGW5J+caV3uvaZGCZaZXGdpA0DC2OvqOBy9Vo1m1jt\nmZJS2bUePirl6k1xdy7dqp8slHrHYLM3Dp0gc4ePYOd+vr4Futxll1ULv1Hs\necXo6WyzU4bBBKT3bKK8hhp2gjXux8jLlJ7GCmcGXyuCbsXxFiHBRRJno7AC\nMM2DT9/qKytz13cl/gF7mOIat8UicOWHGzlfP04bg3y6nSokErUdDwv7Wqxx\nBfAZ5Qp8zGsBy0jC7JjBPS7CLEdyaIRJ0BkWLu7Jc9OgAs2o0wGi3qDzsgPw\nl25+8DVlSMemimzV5mCMkdJbIkzIQ74jLbug1cZ4td6qbQF3UHbJKmv5UWnc\na5ef/lS3NYT13Q2Lap2yT8LTVBvv+Nq4wM8ynt5L5W30ydO+TMs9274pkzbF\ndrXO\r\n=x8fs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE5+qaEc446r0pgMi4BNTxARN6Ugjeg0+4gVe1SuLAYbAiBjdsF0GLDIwdHK8cd+dQrJ0nT+oM0IZe3Dm1MxWaaFew=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190806072705_1565076802377_0.6184698635351469"},"_hasShrinkwrap":false},"0.1.29-master.20190806081825":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190806081825","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"dceaf843ae9ddab32acf60a5f175127b9ca825eb","_id":"@atomist/org-visualizer@0.1.29-master.20190806081825","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ViHgODzzgc1EOsRLkpYly/qs2Htgpa5sY5HWBBSQSJOTKBIk0BXmUCG8ciMtyn9Cy28XFi1aGFsklUHUTp+2yw==","shasum":"ff98369711df1ae5e25b86970581b241da3769fb","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190806081825.tgz","fileCount":323,"unpackedSize":4240167,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSTjKCRA9TVsSAnZWagAA/fIP/jO/e2QvrlTj2LXAexsG\n8xOPYJNvZDFP8eomYJGv5M6d7eLf2BrFEyZ3VUzN3RC9aTvncsWaaOBoDn6a\nOaMnReEVHuSHPEbxBsNvIhjLXnSLyYnt87m4ERuL+WucHdp/fUsJ0sMIpRs2\nx8cEmcsm21BtvmL6tI2ymU17moZycZnPrRSuewLanSSSJOtmkfgTl7pfWs0w\nNgu5biFqSjfgZ8UYqSjN8IGMV9EGdPU7ZDRzvGY3wciU8BtoGgl3/34BpqOU\n0IXPSLKv90gpobLSi/x7dEBXqV++XYfyIdFvndSzP4aDBU3lN/UC2kMv2lUG\ngQUPMAzvBMYwMgWdSMji7mWNzSL42PpBuvz6PAbJVzMLB2yUXnDyfI3okRIA\nH8PIWxVz/6uIZjvLoTDxsFsnkiq1VO+dIzWr7hcZiwsLslAe7JGB/ykbIluO\nwyZto50VaixgDl64yU2t6cwtkM/8I/mJF386wKo5ZdrANmbozn6g92R+veDx\noiQ0Bekthy1cyY9LRhTFkoXRLVLfnvORsKmz/HgcQYD8fAo46eGOT0/IGeGq\nWZ4l1hgXXCUts3GMoJKHd6MlnxP8B6F3jApmUKTFEO5fMH7eeUxi4HlltwkJ\n8oAjQNQIZosEHSKLjEvteu/6tD16HkrJEXaJyoQ6sS20Gql3tvpBu12LwbUQ\n43r0\r\n=RPx9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvCYvDRNnTpRZ+w0qr5HEk4YQoswn8inMMO1AG9SA/igIhANRXYdWYqa/Y3JvNDzuDJh3iIkmaKBNcd1d5gAycELHo"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190806081825_1565079753704_0.6256726867521338"},"_hasShrinkwrap":false},"0.1.29-master.20190806083912":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190806083912","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b0834a22ead8f73536d414e77b9296d7a537c3bd","_id":"@atomist/org-visualizer@0.1.29-master.20190806083912","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-eHy2CZIay1Mt5qY/OjZ6Miv8u6GwdphAYA2aOaLJFhCX3yUcwBZZMi+F7g19wn8i0bfz59ZC8PlDspgZgcnMWw==","shasum":"ac82313332707afcaa4430e8f07f2661f98917c2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190806083912.tgz","fileCount":323,"unpackedSize":4240707,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdST29CRA9TVsSAnZWagAALIgQAJL6FlzNx22a8AO4aVRU\nPp9S74omNfk2zsBIgtVAv1nqfDvNe/KrJ2RuoNSe9GEg2rjpxyuk0zur5MXB\nlG8KUxC+9Pu+VMHwU7WuMnZeA/V7SkZ0RRiIiBLHPC6GmlxQq1/ctu+McdL0\ncR8k9iU8Yx8D1RU5cX9XXHeyRCj1A+PL3ERwJF8KH9yziMgpLwePGlvePUXB\ni1T1GFrnwUCM63dt6ci1CTL1nH0yxw25TY+klRfJW2zm4Vs2/6pUwqpx287J\ngl87p2+fOqt9bsZRQY1Y0y4jKTU9DaaaDk14t8jRHDOFs9kixlrULrQeawvI\nPeB9CfcviZt4Fs/21dyKbK1hhfwrdEUVzYlGMZZX3ge/PH1LOFHKdnTd1TPE\na2rYHENA3zv8QFL3B0qVjLrg9dkbbdQ4DK2ZcEjhYSwyO+er4O37qfkW30Vu\nQUvKr8/WaJc57X2uHnl16e71NIj+V6Sk/2+R3Eei2qKGYe115o2WTqMWV/qb\nXortAGXJ2zIM21Ws+JFAozje5k7jDfMsy3g5IhJs1VGa50+4+MxPJFWZeoWg\n6DFQgrBs26rad7H+r/FyhXjelD3EvbeKXgWWzevnoTWfhRwKuvjFZwwTvGe4\nx7x12V9Ton3ZlDYpCkI5Fk6LXF5MXQKpPjs9aDIYi4pb0bVgUcnPjXkAQe6Q\naCCT\r\n=227J\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEbpppG33JkWRFtPo7jvX1Ndoal5vDfERm9Y+lKvZmAlAiEAtLVqYSqDcd0GPBhrXwLA4WPByt2V5ecW2QEAOTpEGRg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190806083912_1565081020737_0.8495996949311149"},"_hasShrinkwrap":false},"0.1.29-master.20190806085346":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190806085346","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c370f0b35da5fdc653d36899a9a49852a3b7bbda","_id":"@atomist/org-visualizer@0.1.29-master.20190806085346","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-GSavPDlZCGa0XlvlS7c/c+GYhwGZIZsml7Kx8PWpjeJ3/VkvWvXEx/c+CQl3hMXeoV3rRF2MI+pyeP5SR9qf1g==","shasum":"40e3fb13897a5dff26785a899599887bd65267ee","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190806085346.tgz","fileCount":323,"unpackedSize":4241340,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSUEfCRA9TVsSAnZWagAAePgQAIkU5W+qs9qclJiClMGz\nx/H+luuWmIOyCbkPrHaTth2w/7a/9SnGq32+hPEAg5lkmcGsFC8YGifeZxbA\nfvhVI80Wi4vYW+BAOkRwbne9SAp5qgqySPfecNIcjuHOyzLfrTvljQXdjnV3\n3zXDkjqIgkNal30URYW66hoYB55DR+oWqdY03RuPyqHNsrmtvWB+zttg9Y4l\nPHIqmxQSvOpAkefRaXyK0t4ydAGsBfLBb5YvDOdUr9L3LZOwVuZ3KbZWsO1K\n/R8Va51LWbRT75vZVNLVProaKqrPX4K3CRW7Sdpi3Ts+yHEJMx5gKnIaYjHU\nL84VWbXHDWgH5DLSnCAidDPqEy4ysmpMeiLOAOTAAieDoq0Jq9Ayt9ctnoAF\nBgb3Jy++5Zd2KsW0lGpruT0kh+qNY+mV3w33TyRbmhbUtb9ljNnAtsd1HTIp\nlg7Ldn0pf/PByWMpyLLPMhXJjJIyjIdOeV4EgcF7JgT+W81wjIIyF/Lx9OeZ\nLUICKetBAVcIDJqETiJigUVpriTeSjgBK/4GciJOGCju6nsy1sKm4fWvGNXv\nszBk8gvqxcreFh013JCuvVzIqnJe1krwfbc7XAGlr5XEuBgTwFfX9aE9u3BQ\nm+SVD6/P30eJpOS2QdDR/vLWzU4mxTpf8feXWRIwip82DxZNU/qX1vlSnK/0\nAuNF\r\n=79kd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEQ2BAjRH9FH9yXnDnN+oN8sq40m/da4jW9VINvwOiluAiAArp/TnHtQEw9dMlaWX97tIBltcr/bx7+xAY5aJwekXg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190806085346_1565081886815_0.7903081885500105"},"_hasShrinkwrap":false},"0.1.29-master.20190806090208":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190806090208","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5b3842f81d423e8a41182aceddeb1d8a1f7e8e5e","_id":"@atomist/org-visualizer@0.1.29-master.20190806090208","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-iVHHq6QWa5ska7pXz8U+1pLnZPutkxWKJq9ObLxGuxgJPvVDq3XGeahG7lbFKBDqe3kqyKnHhF6DgEhKyRfQeQ==","shasum":"281f77253799485d0206143e74f37174e8a946da","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190806090208.tgz","fileCount":323,"unpackedSize":4242032,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSUN5CRA9TVsSAnZWagAASB4QAKOFZr+QQRNm6qKnsAIb\n8GBees8zur5zZJYWvkcux0l1keILhXHOf+paPtxWS+wYWNnnD6CveDNcGfO3\nzZpDdl0IO0MuXh8h06mG2n+pHet0pfaYmoQcugJUhAlX8aNkWOLw+PT7u5nx\ncBpUmsy0yAwiPHSeHWFADAKkQcI0IRaKWxBDTFft7d3wk7ywJCasC6Nnn5aN\nvR6xCl+jUzyCVK0dKJzsxdSZHIrIXyaxadioS6PLpTu/xAwlt+xzP03fe9Lr\nCszFPTnX2yZU+GPAmad9CELY6stAjdkQ6G/EjjLnTZDs/IpA410biL1BvA+d\nCFIQ5FQy2iTC5a7qhAHR3ugf8eRAG7sxzC1gtLcxtGtqBRgvf7IC4tnxhQm/\nB/lt6cZDqusOAcV8Gr3mBPSVwCh1zvHJ5WRooXjChZZyj7li929e3zQCo1hw\nSvP/mo++ttr+hK/PN5hOyLhIYmKLQvfSUlKbGJrkPNlbAlcJHRfP646jqy8X\n8Os5PXzFjlSU+r4lpJC0ikBYhV6umP3DWoekKVrWBXIjuayDYJBp85Q0iH+Z\nvuQYAy+WcctRxdz/qXUDWSDw3hfl1dkQmlj3LqkhZkt752TOWEBjSag4Acub\noSvSjDMvqYgZz83pWX7jo+mgHAhJVe++jI6mT6ZNTIcurrZL2Tg+lj903hgJ\nqCPD\r\n=Pf9a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDQtF6VjZ8Ev+pqYeDU2oH3nN5jpoiiGFveGI43eJhf0wIgAnmaEEK17BOFR9hVr42t2no3Ye12rHaeQP488mejhkc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190806090208_1565082488527_0.7116001110703372"},"_hasShrinkwrap":false},"0.1.29-master.20190806091546":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190806091546","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"923c0ff38dd3e9e141765989af6dd81d0f9b8e84","_id":"@atomist/org-visualizer@0.1.29-master.20190806091546","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-qWgsMlIymo0xmrXVhNY8Df7ARcU4leouwdXEdKOx58CgAoLvmWZ+ZIXri+M0/do9OxdqTJTrHyXb18wipWCzDw==","shasum":"371712ce91c6caa43d77fa7d219bb7079db5ad9e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190806091546.tgz","fileCount":323,"unpackedSize":4240819,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSUZZCRA9TVsSAnZWagAAIiIQAKT+6/S+24lGD2VSF7JO\nK7nGbxEo89MuBNtTvSI1HWHkMmgA8/Tv9vCfRCjmvyvbz5jtue1dHj9pGpKV\nfMoECQxH3jXhg3VH5ihzvFUdtXf/NjD/owO5i8tR4OVyQyotDj2WgGqEwrCk\n6KmmaPb3x/rm6tFwsTVIEw3+Z+Hnbujnnm7Pak3WQFe01v0vrWZczu/rYPf2\ngecpspMLJ26UjLdg+vl69BHwjQn7bqoVpU8hKMJudPfXadyk66xcuepxe+oe\nICxpHZ4s0VgCF9d1glG+nZlJy4o1CRQRSihZaFGf50jl40TURTMMlBj9/8d1\nTpGST6lCU27/UwKD/XIiJvB1KIRyjU+XHDK5do6MvbYknFWlIEKKTU0E5y6o\nMNaVv4331uGGfc/OXpumqvsUsygihCnZWatxe+CTVs/FHSAOrs9m59J8Fm6D\nu1Xg56gKX70kvRi9rpch6D0FoaFWqAaRcMhmtq5x0NScgL5xOXgOfY7wwool\nM0vlm7Rk+C6yhWJK7AJrgQpr14aYoSXJdNTgTSjpZd2iKDhMlfvVLBVxMINA\n5IVrkzkF+zcYe2YpMtygBOFdqoqSwLfk3NrTImFQxmOFPVrMR3YskGUplX1Q\n7rD3AGBv2XSdJy3W+lN9QzTm17Lore+hqE0KNpARUH6UqP3OqizlYiB7qR5H\nm/wy\r\n=cqjZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCU5UhyRYJ7Ru7E4aEkSRX4GgsgBDnKbyXiYqudxzrw1QIgeXv/5v6jf0XnazBg8pun4k9ffxnbvsCdjrZ6sYi5WKQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190806091546_1565083224940_0.43420280586131743"},"_hasShrinkwrap":false},"0.1.29-master.20190806232010":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190806232010","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d3352efa94e0fe75ff8329cd4f41786a6f8474ab","_id":"@atomist/org-visualizer@0.1.29-master.20190806232010","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-XI8r4+hsyI/8zaV4gZvqC6Y+btfds+oQhTMUX/r0+ntCrBQkUdSerOtzapSG1xTX4fbz5Nrmrg2ceci5HTMajw==","shasum":"c6bdae5bd1c16c58056e2ce00f3d3c518c6c9430","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190806232010.tgz","fileCount":323,"unpackedSize":4241283,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSgyYCRA9TVsSAnZWagAAbEgP/20iltGmFf6zqu5+DWP7\nBSBuO0yG8ZdY/OfwmOtFEfgKRfl+vEyF6TMziB63fHHyjnjYYCgJTU8/v46r\nFlvj1D7HafIM17gA1GUMOHXi5D1SeqyT+/DtecwrOwuQmUdRdMryHeXGyXDE\n8y6bSOu3OwuNUK9sl7UZQGsibX1zbVdVl3jiLUYeua6obBYrAp8wFt4tri3M\n6joCZVL6sBcTGW+q3zLAimv5lyIoeF2oo/rcM7Z42dHN7WVjCn9uAFJRX8ha\nMRjc/Y9vgaCrjygSWQSp9PJ6aW+6fDC28+48PsMUy+IO0/UFxM7LRfu6Mn4P\n6mbkXIoVgGBsVPf9SWJYBjVLW0rMORDHc1rbhxEemcPMEPRvaksNa80jHUqk\nwexOR6XYzFGn2U/kcSP5qETPyvstcHR6+nB7sneW7rSOZ42CQkL/3NWFevRj\nmr8miDNNJ4zr31Zbk05VpC9pSp3vXRxM2GHMW/04Gt/rKLi1bPmF3IsXJNfI\nzo5LGnWmhVPN2XNNv3sSdfN7pPbZ0XwWGRBKZDUX3IDlIyKDJYT0iyBZuls8\nWaUIa9U67fKRstyzBknQZN08+fRY5504rbM+FIMWH+8tNTi+0OjbuvF+tyT6\nSn0evpRQ7kJgjbl891C/K1fskFW5SVJCARu7etUkp8qObZcIYIRWDn6KKj2/\nkfgp\r\n=g/AI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDu7HZl7OsVv5Xs2uPyFbFxdVNXWF4j6reaG9LXYU02ngIhANVMsnbl66WV18uPIwz/eaxYO1ggEK4HEYyBYqKu/HH4"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190806232010_1565133975587_0.026594958747109043"},"_hasShrinkwrap":false},"0.1.29-master.20190807004700":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190807004700","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9f4ca8958fee8e3234252557019414b5aa5afbe9","_id":"@atomist/org-visualizer@0.1.29-master.20190807004700","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-wJmo0rP9ojWbAF2rXGnbJj2q6q5+s7XFmfSql5H1ZlGfX3nwoJSWIfeSw2KVqq6SU8QwI7Uch99zjpqbWhmwPQ==","shasum":"723e04d8ecad5a5437aed87889a480101313041a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190807004700.tgz","fileCount":323,"unpackedSize":4244972,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSiD1CRA9TVsSAnZWagAAGusQAJTTbT0eG0uJSyPStydS\no0utfzLZ/tWO5S3aYJxHwbFVlyKhu9H6rQJ6P6EA7lFig3zXpzpkBM93jtHX\nQsEITL3F2r/d0TLxirBq0fyj82qplcxWpL3HWimc0gmGXznlzNC2J1WCYVVi\nKOq2M2CLDpHttH5bZ4WMdcJ2SburGORon/ODjn2YIaIu0ieBFKY/gKqKMBFQ\nB7DcNYqcLAwztjVd4rCyJHZ+dDecxKlTWzuv7atWERWOomAiCmdBPayga+qC\nwP3V5mS73kJdhNiA+yI6nasm07MQ0ZxHvW+6JwlDzrV/9etrFrUbTCY0cIqV\nvpWBnLJUBYD8kboInOKj3b/H4Y9bodpNtpsXuct5juutVtAUE9wZMUkP/o0n\nzeihsDnv6MxXui95WPh3j471K42p87GDgn8OBkOK/hXiazpBOF5dgOCQloYU\n5GLf2FVPmQ05GrqHMCQ3wPQlIqK1meqKnycSpS89cWQsf90Qn1BZct444jXG\nL/cWJlKoNX154J0OWwP2yX5RV1aA7OS5gitH9eRHiMRg3svr+daNIMokRpVR\nqzO7spe5avOBpPSqC9KXqfRHywA2uKfJR2aBFP9391EpdWXQH1Qq6X16Lu39\nywZ1oMkcxXP0fNTgvyI21G8c9ke9mtS/WLINaz0ohQ+DKgc320FZs+kJO05A\nuBkw\r\n=4K1+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF/InY8Ty1M0WtXi86rulQyCkYyT3hQ3Z569tg4Gqcg5AiBGvFzfb6iBy3p22eqT+vV2qus9Jat/exXfaVeBv6pPCA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190807004700_1565139188956_0.06327472773903287"},"_hasShrinkwrap":false},"0.1.29-master.20190807025025":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190807025025","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9c8bf8dcd6104199c6d402bcf4a840f0fb715af8","_id":"@atomist/org-visualizer@0.1.29-master.20190807025025","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-O/fxrpYAcWPcnnyKnkWHkLXYS6wFF/w2pP1ivonGirHNw75GfiLoflVTycJoW2Xd46PwuGHakZ6JILN7eF4DSQ==","shasum":"a4459fba180d901439de7ae862528b5ffe2889ae","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190807025025.tgz","fileCount":323,"unpackedSize":4247477,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSj4GCRA9TVsSAnZWagAA4DwP+QCuZ+QFnCJxKpWMkpVQ\nZroClXSOIIeMxpjjCE28TVovqhXlFZa37FmmSM60oHC2Y7zXTBTyS2qRSgab\n1J6DPSugUB3CqRdR3f6NeyTwbOizj8TckT4DIc7zHTKox0mnBu+P6oeWkykM\n+JYdsP4RBLf5vjHQNywSzgOuwZsUXhnPIkH8x/TnKTXcLL0/L9rSbygxuxnr\nbgktDCHk2ciVXhfQ6eOR9HcPPzvgFfFljnFUkV1VRlA/etU9BJ4dKkmO/Tvd\nS0DCOY1LmRuLlVzdQXCMRH5eZQozHWwu7MxckGpb3sM53J6kCapOPFVnsJfV\n4cjaCP7xixeH4fu/K5OtWh8z1mnLmUnjgqAA/5e5R7N3fxuCYMqOnWvexTeh\nSxmW1TaNzOzPqGKBstDH/t+JxaHaUCHJy1HuOCDFhc9E96KhAyGl0VKxINTe\nufxW4ZlbNkqYXrE8hHzNVDJYv+eeV07etCbgjLwjkhil3sMbNqIj8uGDJ3oS\nFMd2U1owfgoH3HxtWtsF9HDAfBThERu9QqrQ4j1a7XcHG0wwNmPP9lxcADlO\n8+NGO1lVeQ0n4Kh77911S7TNfdCukWzmK1vr1qcSE2YQZHfUnEhTM2yUKsbU\nmz1EV0hKSKZ3TD9W/XhVlwMeG75ypmceoKcdb5ATQj5M15bZRb76fIGkag3W\nFo7E\r\n=9LHY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICvjEx8Uzf/MrNRUyx4pogzjqMGJA13QHheNgJV1IHwnAiEAjzHeIbaY0Q93eFJQD4UzJFS/aB4VxV9jqoxtwtB8X4o="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190807025025_1565146629029_0.18446230019691412"},"_hasShrinkwrap":false},"0.1.29-master.20190807051056":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190807051056","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.14","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.14.2","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"517b6da6fd4037185b26a679c07f1040ce721a04","_id":"@atomist/org-visualizer@0.1.29-master.20190807051056","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-VAv4CxidilNe4qHhLX3HXfu8hfHClOztEg57WZyxU74aDZ1x1hsxFsmN7laElSuEByYo7qM1VnwZzI4jPNHOnA==","shasum":"f2667685424305bb7e40c5a575a5941b4e48fdc1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190807051056.tgz","fileCount":323,"unpackedSize":4248877,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSl7RCRA9TVsSAnZWagAAiPkQAIzXHq2NGvbpVSiu6DUj\nDI9Ft/3G8HFXekJRCLjtbM4RRkrB3sGY/06lu9uuX2BbeOFSnhjy1EW5guC8\nMNPe5m5k9EtQFZWdvpd3I4FtucihRGMx2BK49rjnLB27l1lZm2cH6M9ZEXhu\nS7ExSfc6DViELZCIz9Iu9IkrCI5H2EMMpXDjvRFirKgt6RrMrWcTfsCNVq8u\n/3/FcpLS6zlfwBYxTj2pcYVw0TLMc3ET892y4Pq3viwq4sp2ppDgovt2pHuO\nCHIWOUtATNIIaoUOfVXrX7+r19KzLirqmQMDZPlFBOkFcIXPuDHV0+a2teGA\nd+ilSI4OwSA9rg0dGB9nCH3+lkclThcc+1MgpBKFZj++NnFunho5Ll/8pDUm\nTEE8nO4znpG7eVMA/f6W1KPtCgslUyPQX7QqiABwgwEiWd32KfEFX7CMgQ7V\nnAGZMxDe63Nwe2GQUCRQA5VZcn5XJRS0e57+yAtz18KwmXJYuWjOjI8t9QPn\nZaANkD0kZhYMsufTxfbT/qqUkhDAP4DurLYq+a54z+YWndDRxbQPRX7MsLfK\n9oFIru5GlkLZkJf3VvcBfKQ1XrulmJkBPheYVzywzg/1fv5dgwzlAy7y8IA/\nFu7qqg1S9mD5XO1LHE1g38LhG3CXGzslTSRtS55Lj9ipxf5CfssgyCPHc1lH\nS67+\r\n=Mn7o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9k/YvxwLOcBfO2X72cAUMvfNJa2BI4H78ya+/8MPQHwIgcFlf1E8XQjKIIzLcoKM9yOdvl2/O6+Hcgme/h6Byz1M="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190807051056_1565155025058_0.4517836643810047"},"_hasShrinkwrap":false},"0.1.29-master.20190807193112":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190807193112","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7108e070d520886942055b1747315c7bc1ac038e","_id":"@atomist/org-visualizer@0.1.29-master.20190807193112","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-8e/WKjnDzfK3GIeoMu7DYxUscyKMlO5uKE3j/wA78nUdRcLomi5BqEhb0XzNv0E+jSH4Ne2uJ3aT0a5RocdFOg==","shasum":"c43bb0eb742ed2658b345fb593188818aa35ed88","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190807193112.tgz","fileCount":332,"unpackedSize":4263166,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSyjvCRA9TVsSAnZWagAAfToP/jOOYDwbK+yXHohZ6+55\nXN/OoMjMCFXNglPFvSl1JF+7//+IEAgfUhYBqZDz6Y5okcLbQdldGEBzzk+K\nzKq7w/ig3rahFy91ADg+98GG4O4Ka0vHR75bjS1Iyyf6Shv4pqkfDn6dUJiH\nAk6akjy+1vVQ+aDusBOXLKWkiGDbR74vtrPlKquJHu6sZ/nG4/dpI2kWld6H\nglIa/XIykub0XxlaRnmv+VAws8HxWhR+CwLaeLZpj2NrpGZttWHI6QedFkuv\nWXXYvusp5Dcq7XrLxwusUDhrgzHPBftjnzMfGQ2u0thqmNRBPzvuF//GM9+q\nk7itRR6njuV8/ZueCpKPW/kIjG3GdLbMG8S2ICAzM1ImVDvB2NmMqUWsxMeV\nFQ4zMkgbFId0j/KbNdOF7/UnASA7S7GBgcw51cTCESft1ndHeJBGpdO57gH9\nu6aYWKJlCEUtiUgTSggctpN3rnIXWZNAgKQ3LkWDdSOxyGGX2eCnqNe4YcDg\nZOda/QhfB2BI1Zj5F7pba0yfIVWBUryUD/us8ITt7WjraAErAJNll3GOWCqb\nhYuFJfQwawXrkJc9g4lW6NeFjyJvkQbdIa2kQLgRGftguL21r2vQxKjEUwEI\niOR0gcdq7wKly1theGA1FcpjP63/eIaSj30WbV4xHizx/QbFPjY81IaIZ9bO\nhtiK\r\n=0Qp7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCxhiTcd8MOi8KTB1rBFMyLLrf03RgOfm0/Nkc+RcX+4gIhAKAMGshtw4045efnfrY/ttkYQYDeXR0WKc5MPLDyEFOk"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190807193112_1565206766419_0.6491225473787823"},"_hasShrinkwrap":false},"0.1.29-master.20190808082113":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190808082113","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"dd26c42347ca968158f3568f2e23b1d08aad2897","_id":"@atomist/org-visualizer@0.1.29-master.20190808082113","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-iZ5q3Ih+aodsBMq9vOEdxorUzJ1GV8HSBKWlul63j5AnRaM2tprazbXHcdYjMbqhlPTn+e2ened9NLJwjXZ/VA==","shasum":"907e76a06eacb57f9032b982354b445cb2d04140","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190808082113.tgz","fileCount":324,"unpackedSize":4248548,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdS911CRA9TVsSAnZWagAAsrkQAIxGucR5byccD2YhLBkD\nrbbKap8iRBOKLImleyI81Xx1UAnBKFSlq6Ar6KGLBfk0N0zEKJ3gtLvpX6Md\nO+sPNZa/bgqt/11X8fwgvfKZFv+L1xQoFTfEHZcAIMZjdBLuYdKe1fKmFl0V\nGGkU9bvtF0V9T1w4Wrf+hRDwDrcEc0qeeSoSA824XmvmId0N9OftftTklaX+\nKH/XApcU4D+Gd6y5SN3xjHqyhz2cV36ShHLJ4g/YgeLs7FR9MnOv3tbCJHLq\nrFVj0qz8v3aA8Jxn7ufamJl8CWy952TnHV4IQGtLjCYgpvbS3xZ+mdz/2/mU\nF4BNGmkbYCbpRy7ha1Jw8vHKLmC1aqIvfs3pBuQzZgR6deoB8MC3QZ50vaxI\nzUcAUEqod3XkU6vr0kthDaHIB9J7I6REPJ1gBZAK6XYVQWy4cEWqjcHAKdMa\nusX+sMGsa6+Gb48xGM3orM/NGsGOAV+ENQJ5RhZZpt0N+PMQD8ovKn3hW+/u\nHGg9eQrB5yYf9PYhqVWuNXtsE0V1eM9CrfaziXvCPJ8Nd0Wqfnjiw1LBKHwC\nxZCNqP6478QsD+kNCGINif0C3K+z0kCIRMU5EJ/PxnR14SK6nrPKwwlZLWDC\nHZVrSJnuoWNlVEZhaC9eK0QWCvXP6PFYc34SIIKUykZwVn5TEzKMy2prwtFs\ntdNh\r\n=lPi8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGRQoR82IJWCo1efPPNi3g+7aUvAoML3lEWpbIQl/HmQIhAJeGSTEdDf4D5ajmk6qcs84UyAJAkPWfBXel2alixvyc"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190808082113_1565252979826_0.5524339195630705"},"_hasShrinkwrap":false},"0.1.29-multi.20190809025341":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190809025341","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8fc8db03897097a0693311c881e18dd2ffbff76d","_id":"@atomist/org-visualizer@0.1.29-multi.20190809025341","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Jya8Pn1ITfS9sTGf8mpAPsX5sWigL/CyfLzCCjO9CmXBtaY53TdCj3mjpliJI/A5VsFT6EHwytDSsdBRsY4Y1A==","shasum":"7595ddfd3dd69a5f1eea8525da2f3e1b305045be","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190809025341.tgz","fileCount":325,"unpackedSize":4252589,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTOF/CRA9TVsSAnZWagAAYg8P/3gcpX+r1Ccyuxt1OSJc\nsi9+/aMTUMLouNQTxkiSYorSa3ESIExKtPvolOkExRvnUPvVOO9paZaLve1r\nFnl7Us3KkB06OUr+B1crC+ZCOfZFLzvIFzaSw2ze5K22rENSn+btc/XnJGmd\nMSOZ9kjFda1g9s04AaV82ylUxoEa812xOf4AS/k7+WYkj6g0WgFanr3nhHqO\nQ7rAt3nseqaVtYvGqSA2X6DNKcVBKvpOV1Uz3r/bFIQ1Xv3trV0JJy/WXXQE\nNma7W19xcfugy4KKOxWPyV4P9yr0jL0KO6KwdEzQ1n1RlamaYQ14+C5ma+5+\npBT6dmPI9gDIsWxgPdHg/8Tq/mYhLtjK1x9vThkoIA0kOxOvr0UMsoEGfG8A\nRFTzva92ieb3eDaY9pOG8Siws2ndRMf5J+y5zATHYvUhRGxgW02COhLww0W6\nKTR4bbVDH0f0BEz7jPRaqtn2EvpddmHxX0U6mzkIAHLjTVaKNVa51su/Ts8P\naqbrxb7bNrkUTduHNN4SdFIY3gfaltqL0lIw+uqOmO8gH4OA3Z89e/YoYKnP\nJH+2aQN/bgudI7Kh4YIjYDjEbYUKlvG9lhP2cWVsdH2LUGIWy1wPmX7mq6x1\nJ2Ksgx86fVEzi2dvKdDH6ixQ1Pjdr8iiKFa1QSrSHisUN2Ty145+CusZbVvo\nuOYo\r\n=Zrfi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEhOA3Lob9WcMsDrLPuwsqwNwGjCLS3O1SJH/lCyO9gvAiBauUmR1eRveS681+tXQg654F46Ud99uhGdiqEmaMj+ZQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190809025341_1565319550560_0.7386335037060527"},"_hasShrinkwrap":false},"0.1.29-multi.20190809044614":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190809044614","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8ad2b6e5c7dc3309454f9b2edd8a74016d13c674","_id":"@atomist/org-visualizer@0.1.29-multi.20190809044614","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-loYJf7s4+kCx4gSWouGTIMqNK49e25LstK1ps9GU3XoTwqeCOoMOzq1j3ZOeEbZzIi5von8d5sqOeQuICclN4g==","shasum":"236b88907cd8a689db66fc40876b153151d51e13","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190809044614.tgz","fileCount":325,"unpackedSize":4258249,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTPxLCRA9TVsSAnZWagAAvkYP/ArlbidPobAtJY70M6pB\nk1JdRP9Dw/GvwAm/vetDK15RkML5eStIyPDMEzTPGSr/Dq6R/fBHOkpFZd9E\njpF6lIV93Y4lnh0LyEfJVnCYiEzDbn6CQBBKvL5h3RApFlvZx9uoytYW+H/7\nQdJOjXr4lPwZnZk0iRA/BJPNer8mpdbO4vLMHQ2HWE6k2J9Q/dYyQNbuznMC\n+c9l/sqob/DRqdiUmGwOzHf3qkaPNNj4kquLu+YDgwVq679B3V4vufOouLqK\nxjwxfoTlPCkKMNlvWzDcO+Jp+Ct0Jq+rFYoeiALI+OB6wCTRSkFbdNJUYXmB\n3pYixQyDZkI4IG7eWvZTYtztaCQZshA5Nv6OAQATrPbNaV+1AXcId52xxFIi\n7bJffrK8dhhNw7MH/wH7LwxaGMKSa8jzua6SbyKkJFB3w+O0GmwSJ0cdxyxc\nWMuGyHeJTgCq5RRwI2SZnw6vi/zZPoedtLhDUk+uAiBKWXz49gGq/Nzm7GQ+\nxOFwDsFGvB5sfWkSu/3UM1RJfmQDIk4BvD2xgEXYPtyRA39ggJID0dnANVqx\n8ajYi6FGNg1KCW0FICaFDverqCI8X7NtlBJrGABkRW+d7keBUN0tHbicIh4n\nJuHR2ZY2KySTcrGYe+Nm9z1K8jrIlKF0rbmEBOzqxf89Ww1l49ilHw70jy0P\n+cw+\r\n=bwe8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH15HspUI3u1tnHskhgzSiijlKXNBxdBqQTLupwKUGZLAiAkRtvpGwoaUDWpDpwPNG7i1/+b5o4u8r5BSI2lPCrb4A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190809044614_1565326411065_0.17045122648371858"},"_hasShrinkwrap":false},"0.1.29-multi.20190809050947":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190809050947","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f19570192338f49d329c8222ab0941391eb55e44","_id":"@atomist/org-visualizer@0.1.29-multi.20190809050947","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-pFaSMupfsB0Y7mbhNR3AMuPH9TN5QYxTpRDMxmZPNfgaWTOrOQQRk+DLlEDCLpZlMV8tk4ZT73AkQuFQodX29g==","shasum":"73bc6289d2d269de9ab4710f2fb36fb24c708be5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190809050947.tgz","fileCount":325,"unpackedSize":4259543,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTQHUCRA9TVsSAnZWagAAwMUP+gNXOv7xi/qa7K/TXPbS\nl0LdTUP4IDbsTjMMoA1QY18MTTKrDLvv76mvr3dgQDpTstZsG4+48Kx5Iah+\nA+J5yQp8DbKcvaK37um+/u6YA3++7blq6mwTW2mnkSSN6/xLdEbCZQMnd2cx\nIw0UD/weI4a0+4VfA6AFCDjs7iPsf98vC86yC+dUQawLIHSLpbFJZi3kFmRs\nAyrRBCUBdGAVEpLybdmIMGO62Sw7Yh4Gu+iDizf5VUtN1nbtw7ZcmzNVccaS\njincUF1+p3DzY47nOa5ma5Kd4nH3/T2v2oddp7g9RHn7Y77NltUaIXxVf1mD\ncKVugt31t/REIXYD5JmFnDUvmFLDi3RHaQr8SiFeF+F5LEyR+XVyuA5mZMKm\nfNK3j83jaRJn8JvH9xjicApGb0xs0dwyR4PxqREfDJyYlwti0zw2TpRGocP2\nmGkxH3Z4r4yxHfBU3V32yPceG8AW6BISAvVDxPunCypPFiOeHH3KgInVnzqD\njsCW7ew3f4XdEtbqMWFxLge+/Bna0jpVMnxhJ5NdnIFYIW85dBnutiksuhye\nInCRWL7L7fVMd4lHGcpEY7+vu/kE0tljx05QU9obisjk/EdlVeoW3Y/eVBDs\nfWzM/2saf/krt8y43Db/NpfFpvchLx1ZufHZ7/QUjmg9VoQR2ccuXFwpUpqK\n0OfE\r\n=zbyt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFjkDHpfcSWj6iIt8SDFixULcmZGyXA4WsIToHD/oM5VAiBGdbUSHH7WKxjEMtdmW+www+724NITc3/ygyz42/RhDg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190809050947_1565327828048_0.40298311139321985"},"_hasShrinkwrap":false},"0.1.29-multi.20190809052656":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190809052656","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"71167fd26f66fa3f8b8f2100c13347bcf49678e0","_id":"@atomist/org-visualizer@0.1.29-multi.20190809052656","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-fKRaSHtw4MPjtRv4OuVzUkOlrfh67rSqvGacAIJuMvoLS5EtfIjdbluf+YEd+Dwn3Z9ZQOi/dRJ3ihMgag+IWw==","shasum":"1743f81d29100f9b41ee32b72df41b1fb8106e4d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190809052656.tgz","fileCount":325,"unpackedSize":4259558,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTQWVCRA9TVsSAnZWagAAc3MP/RhLPZ/4XqkSGIA9EMZm\nsRiib8R0TdSuaDukrkLqmPganBHLsZ35AdHnwsxlnQyR6xATgzpHMHNPysj9\nLkHwLXlcx9UjbLUrssLvhrSIZ625AYdte8BpxH3/MXWDvBi/Jb8bMygIg8lY\nDiauBkPDjEi5crCHKMPJ1R2FQN5UDZ7SYfZ5jBD8pROvnjHgDuXR6uY6UWlF\ncBXwEyrtrD1Gt1U/Jr+bWnDr582t19mB/KIfRnGs5DfkZR5HCcpxwkPsjVa2\nH7ZVA1RociKJb3eWUEXAHBFO2cJfIb0ES5tlRuqwMi7zWBaSffTYe7nXhc4S\nO/F2kv4Q9IzBySMFMpknqAWfCXKAVCanijN7ZrIYZbIdObfLW8MmjyE9TSqx\nf+OXcwYThFpFZzBFV4b5A9CPLNjhQ3W0XkK4NgN+pK0O/GkD6QWZdMi/O5b0\nNChE4KCU6rUM9tUZSLamGOqSlyUTbe4Yh/0TD8OQlU11SWZJfMZwMqzidnNH\nDf46BHoS/O9p9L1cch71njzGBaCWLQvP4ld8x7EndwX1SYXI8KxHqhAMeqYT\nXhbbH2uOcMjhC72n2epG2FaiACuiKrhnqGeWNIPa3k6Awf6KiqHiMuohhbzX\nQcxLz3FeCQN4IDlP6vdnpN6yM24OW7ZCPIP8pcfQR9Jituc6fSW2hhLWpLT2\n2dhc\r\n=I0u+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAvVDxSLmNnSjmUYs7LC/gD06CE8AZyMOh8/QwRZ+wNkAiAG7kq/AIM7+KhMC/lXhKiD+qDSKs3XqD88rXjADlkhRQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190809052656_1565328788699_0.7845445096390056"},"_hasShrinkwrap":false},"0.1.29-multi.20190809075927":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190809075927","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"70db0800d2f69baf8ee179a7c4cd80f745bc71e2","_id":"@atomist/org-visualizer@0.1.29-multi.20190809075927","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-TE+EdCnk+DC83mTahMGQCJNnmMeC4hkt8ZeCGQuzKKDY0Q647R4KC5F8e1Zz8o6RcgkOxBOeIXbHcN4vs+4DKA==","shasum":"fef6a90abc29908c95996eb928fcd12765d8ca70","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190809075927.tgz","fileCount":329,"unpackedSize":4263645,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTSlVCRA9TVsSAnZWagAA90YP/0kHynkGQPsRRPnSNV1z\nK0qPT0uoLwWv1Jy7U6MGEMKoBhDenTUcBDwNvQwPBtCfCdffPPy5/Z6gW0vb\nMWT+aB2XA4TJVVT+a0yk8qVx/dTuHy5K0ahacAnomtHAIxvXR/5U9GDNF0HO\nL+HY8Qup0X93HFnwTl1ECwSnqbQvEeSh/dUsVkvpWVN43gREzfB3d3M+/8ED\nVMNY3A3cWrnQgNoczS4B26flhwjSb06TS37ccHHrYi7P7BuTcZ+4PMuquqzI\njc7PQFylIsyUtaFkEtRcTtkn96Ye+RzoYhM95r6uF/EWtBGYCiz/cQVvpKys\nsCtktBUapzpy8sz5+a7lRlJHX/ii83/yE0U9YRlkwGLAMosb2OeEsa3MQVWf\npccfsxSYsml2B/239PRJz36E/iSBZ9Fj88Wq9UAuLmpLishb2X2eRIehjb8h\n1pBWejZ2t52omY42+fvCtKJrHyoIJRZYrdJAOyWCT1fkVzDekpymw0YbFI8k\nF5xRi6FA2yq590NXuCFTKc2fCL+T9EtaikIDQ3hVUo1hYe3YGxuq0SlBbAct\nvWg93D2uzCUkDgHsq33mfRRoh2Xj5+v4z2NTV4WQSKWGPakIzdflzFi0UzUY\ndiYcKL4jV3fPxNyDgX+Kb68t+fNZqyQJ7vWat74z3heob/20GIpejsg2s3Jf\nD5/K\r\n=L44h\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDG3YRPz1934qOvCBI7GXM2eRHXeihHirInVl0qPXpLpwIhAMqQn0HZUIOcoKSvku9yr+ieClvQJPohSf6qqZJX36Oz"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190809075927_1565337940902_0.4865672498375182"},"_hasShrinkwrap":false},"0.1.29-multi.20190809105622":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190809105622","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190809101008","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"77150e0f9145d4ab880b7df6cd117358a6b2c35e","_id":"@atomist/org-visualizer@0.1.29-multi.20190809105622","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-lSJ3wdxzLjUI0psPxGDYxdQJ19wVR1oFRi5PoPU6s7N5IPUuE8b0OqMmj41OZsg4+vjMwVSlW5jCU6M0ShXzqg==","shasum":"ab72d65f124af55cbf370a9c83be2d75d455bc09","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190809105622.tgz","fileCount":337,"unpackedSize":4272322,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTVMyCRA9TVsSAnZWagAAtMMQAIgQMmaGn0MJ68aI77Dj\ndnNXIY24M4XXxkf05MhPVnzA+I4dISFO3XQ5A3Y/37uO2k0hkJUTjD6kHSka\nYj2faM6q32GdHK3c/HyLtk5vYa5Bg9BSoSTClkuXAdqWx7GNMkO1Fo0ZW1N8\nchmTrbAnlzfldlZXQ6Wwnq6y7wnkdMsEXGZpMEv/eZYm86Cyvo3hIb4043pV\ny15L9gg0eaS+Z1iL81AwHnmTZ+6p57hsjSkPAa7Wyzo2+He8jCiz3PD+n+JS\nJOHQRvi0A3LMt+5OKzaOv7TX9zPXCWWMT/neiKmWw72f5skmbwIRkJhynKUt\nq4wx1PNiVfL/rMmvfM4rNwfzSBqt6wDvXZOLuxqMOCEDQ33lnoYbcGQAFtH0\nW21n7Q6laDfm8TgG9IEuMHv5U1sz0oN3Lttind75R2a/M3C6q2ta5gVwRgQ+\nKDSFbdsS4DcO2WBbTyezeeaZc0fE8juCtUaMWbHhCCSXFqdIYkP5FJ/9Jsel\neeKwkkQYlrDrN2mBTJ7IFw48i26e9u5lnfzXeJPZU7WxZTU6kn3MolNY0egZ\njgIqi/DMU9LypM41lZmFp+BWrcD6C8DtayNXJcBDz8x6jMgP8S7Odhm5ZozI\n5FZZBcI8lUfEnnHWCUJv1b8zz/Xqy+XUkictF/MFUU6IeFeqS+d0GTDSerkj\nwAY4\r\n=BCie\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCTWlWzajQw7/s8xOV/wlyfLAtHIXH4/vLtm2vdVJ/ibgIgEEW6E9sGmqCcxn3mXDUSBipDqc4ywwIxeJ580qvHLnc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190809105622_1565348657595_0.5515278812487479"},"_hasShrinkwrap":false},"0.1.29-k8s-spec.20190809222505":{"name":"@atomist/org-visualizer","version":"0.1.29-k8s-spec.20190809222505","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"07c611d7d1fc45f9448ae1ee11f19e1e32451b39","_id":"@atomist/org-visualizer@0.1.29-k8s-spec.20190809222505","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-LD+FmAdiJKD3FdnJzfDdI97rMJ7UZuGWdTV7OWHFDLLD8Iax+UKGDNVbHd356tE0aiS+/EdPzoqE5Tm1qIALcw==","shasum":"06b239d5ed9791e53e7434f7f3c01f868892b2a4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-k8s-spec.20190809222505.tgz","fileCount":328,"unpackedSize":4260107,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTfQjCRA9TVsSAnZWagAA2KoQAJil44ugG4kO/i6PiK/o\nIea/lEGmbrUdv4wwAnOT6S9THFFQJl8kMkSxMw6w4gUIkI9pxS+nGvFVXevG\nz1HWFJLzOhwj/LQS9ZdTmPNXSttyj9Huhwc+TvqyCpSMs2qqYn9gL410nF+D\nxEXIr4l0NUomTO83r/4Di3Lj0/rdt85e5T2+zyzSHdzaHeEQPZi9AwUjAXZo\nMyyKli0jhvn9ISZ/Ar1ufRQg5w/orJvsgK59rud+m5919ua9bqFDB/1Rd+Ve\nZj0cLdR/3WmbWIk3Sl2aULVnzFCkC3RG/AqcDcQlGAechO9yW+/WH0cEOFye\nXZdoTvhZm5+uQc9/CXMWGLmf0C8DgAl6xuG8VGUQUHPdV7UQFWX4gaF+M0wL\nLtcayah4SHYmY5OLDdE43hUUYlTJtQ9CHyid+XnQQM9l+yFPYIZTQyT0yC4B\nsVTsMrKByFTmG6Vs/b8u1+0tL6fdJW7/TdWjD20En+kg4Vkz+/9mflm7mswi\nYa3qgZqLxAYxUQmzk5hXavRqbxG/+FxEXeeMrj9r6QKKPZtim3GOncR2lM/2\nCKBPamxeX9LcFYdQA4p9Mr4YbgX9hArk4kNxGHLMeMaCbyUrlDAgoXTLRT4v\ngyP9ncrqawUxlGEh1uW7lq5n9oDl22uLTRorxEDFwMmOmK79Bj8yfCrgXrEJ\nZrIx\r\n=y2YF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGKMAVsWC4/BmZHuAxAGalJePkaRU8S+7nWYdULyUtBgIhAL295JOZFLCN/3Ipn2I/2cJ3VlP3HmkGhRn+VkOLVRPO"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-k8s-spec.20190809222505_1565389858580_0.1377372099505516"},"_hasShrinkwrap":false},"0.1.29-multi.20190810015812":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190810015812","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c360aa033a568b66c157c5a10560dd459d2646cb","_id":"@atomist/org-visualizer@0.1.29-multi.20190810015812","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-dwwYU5kLYFufSeD8wu95ww+GRdlgKfHNJzeaWlCsT5SSC9YU13JEvALfNfWGqD9cINlL7HU6599I9lM/HHpsPg==","shasum":"00ffc4aa2b05131a23285c305f422803e9ab723b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190810015812.tgz","fileCount":337,"unpackedSize":4276324,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTiW2CRA9TVsSAnZWagAAT5EP/0gpB1mTV9OxdjC3S7LN\n0aqIn1tViti9mBD9W1VJ2RaC/vk3ZNe+//cw91wzYQnh6OMotJo0btEBF2mf\nxsJtIuMruWHWRW5LX7vqffXn1j4obKck61gisZzbNPdtZwWScogCXR5Hc6sy\nYOMKj74dvy2VTOScheuhaRw4yXhOlT08C1kK0kumlFfGSCmGWslTa6DbKZLf\nhMK+sMmwdoace8ODAtJ7iy7f54yBhoXRA2NZegb0zJhYPBDDTp3ZCNlbARy3\nP5HiYu+32A4CckBGlPrsXW/13aTp4LD9Sek3nbelboLc5e0Y9nx04pl32ba/\ncAUETlKUrI7dOypF7OWiiMNnS1ysrMfYwdPGx2DbBErl+jvZoC/ghzX/4zg0\nrDhJOcBZ83oYKckyM3oe1Zk0BB5kQp+/gE+aX2/+Nyf9zSXCiSVXxePVdQ4u\nLcBIiuCwntQ986nvvMBpPHhL6Y8x1FVs7q9kdA/t6kjg1BbxDhS9Asz2iXBq\naxffXtGN3+ZzpgWkX3y/raW6FHRLEZW8EdQGN+SL88utMPe+I94spLvNMzMd\n1d3T+BGKsKjLdMST4r3YjgPQgfKEgEtVGhj0e+VstbnsnO3jiviXFzpO8c72\nlhDD9ZeISJWOT4YpQvita7GIwQjolIzxtCPTZicDzKNjz3unfcrx4rYW1uwp\nFAgf\r\n=ry/3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDxEzN5X7dZmk/ypAeWXdC2D3PGv+yQIXC8d70RvriT9AIgd7tLZW5p4sWc5fVPLzwexXcn/EP3VQ5T+ELC5gNfmpI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190810015812_1565402549842_0.8917553570999974"},"_hasShrinkwrap":false},"0.1.29-multi.20190810032058":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190810032058","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"75bb7ab60790058286007f272c9157196e029869","_id":"@atomist/org-visualizer@0.1.29-multi.20190810032058","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-dT37/ghqOCZGRLd/izPfwszDA0T9CRW+tU0t/j3mjUH16J1PoM23p0JAzj5xErHm2VZdVdnxurJmderQWsUBQw==","shasum":"1b1abd767dff7d588acc0650dc26154c3fe99a87","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190810032058.tgz","fileCount":341,"unpackedSize":4283588,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTjmgCRA9TVsSAnZWagAAzgcP/0mSTa7q5OwFV5SdJ1cJ\ntMLZAfLiQbLIA0FhEvPxeJXxQEIdIXOeSsmsPlWXCD7XMvH9k84XVJchqJt0\nlfkMJlBoXgv/8IFs7GMCsR5kp+ZjD31Xvstp68zL2/9MeVemGCA3CD3wfx52\nP4QR6TvKEFmpoOH9EF5SfQcVSQ+AAPSnTImxrHSfMUITvUkIuVvqjD58UFVp\nkss1AB680raCN8glree50WX6YoWIcDdshgshpjsZMxmt+eVZTp8ZMU41Df5E\nBSN+L3+YzCFDAk2CNhqWF9fok9InnHKz9HjgXdTEw0XUZ9pcy0D4qSUFHVa/\nGk3PTMJCpVZLOEUG/LKI/kBG3hUg9r+xZO/5sdPVnJ6wM4QMxdAfRyrKQwGw\nAxJxzg/Y3EKpRumuQrszLcMc4HWf9TlYaV3rqjjGVE/Ubt9St++8zNDUKm6+\nb5BwOICXgoHU+n9NVIFpEZ8igZlNQoLLjDWka0zaPiZO2oaFhXrh/+cb5pXB\nXk3wW49ryqCB7tje6ooGhTpw8lYwfbLwzfR8vt5UsaRbW+TjPDFn9OJtDnBN\nynqS9HHS/MlBSIpag7rmWi6TDZDh4ZaIUGD+gvtcA3n17HAqvcfi4xO9xyM8\nw7QYuORErZYwOpWQXSbzOQ1sohFhC0vK7rWT6+BVoSD0mzxOFKm8X7HU62eS\nbEjB\r\n=Cc1O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE4wcliHt8+/bI+jrbgrAL4S5wTLBgcbzMBqKwHDyvOYAiEA+9Bd+KQr9gpYtua1yg6mYWw3MRu40fUTnNtnKSrHHtA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190810032058_1565407647602_0.7560173209327707"},"_hasShrinkwrap":false},"0.1.29-multi.20190810034541":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190810034541","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6fb044a739597e530d12f828515a228e4b6ba585","_id":"@atomist/org-visualizer@0.1.29-multi.20190810034541","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-6PNL2yn36TTYvXHQQOJ+4HbyRMsf5mQwhUokISb/H/6MqBjQvaPXXpbfHnVvScPdaLBW9bLsmfzXpO+HvswAFA==","shasum":"eb03aa4a4bc33336cb354f999c5f71bd0d811e83","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190810034541.tgz","fileCount":341,"unpackedSize":4283609,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTj8bCRA9TVsSAnZWagAAYfwQAIhyArwStl4gr6sce3Rb\nbFj8LIHonuG5sbiNYT+CAtzDAkQzEP8e7PiTpRfNEuNCIGD57eBEwD5irC5J\nDEDz+BfUktiw+i6Y+UDcG2UxEJeov5h+419swcozI5na5MDjJbBjP9VKo/gA\n+801oZByfSKVLSU8PsraIXXc1CtiZRguCNkIm68mzpcPDNhjdigmC57U3Ufv\nZ5cI3pJsJfuJP0dDpiIyS0UAnL8HjavWMlTkbXBvY09xj3/q4UO21Pl2FGJ6\n6xyKhQkHtlV6YKIx1QdYVyBge4EO/VZTmnz61resIkb273QgPmwz3XNGdb55\nfxSebytSklSRRDYjshF/IbQaEpRVbj00ac/QVEiUNzidu1llWERuPj1vcKGx\nDDe0bbaXUa8Fg40EQ8HspKfTF6D2TkWNZb22pW0VICq/h3pIPPX3LFaGO3YI\n9uyvNrSNmARHiynzVjkDQA012tM9xzjj25u6cpi5uxzMR0rKAeSzD5pw4odB\nJL6uTUgH1pLLEFmuA61yD9W/sicS9eowtxk1bJ2X278ZwK1/BmuligEggv/o\nUVVmL5UmSDeoeXGom1tvi4LWJjyxuztYmf1tUYUXK/t7i7BwyAKOTI9MZYP4\nRHAO38bYMCwx/Eicg6P1Jyu6O7NvGDCXu8FH7CWdd0wAnGWudMY+Bn1ZZt9j\njXZ8\r\n=XmBe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHgUXH935lxVAs2af5uBGSXVEhc2nsuvQMzVIITtxd+XAiEAokcK2YmzC3hqcq4s5+hxtZN0uh3f+y1ZFvlGB4agTr4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190810034541_1565409050876_0.6999494246439133"},"_hasShrinkwrap":false},"0.1.29-multi.20190810043746":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190810043746","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"92f4f6306d99b0b1490d2bed564be455710ffe0e","_id":"@atomist/org-visualizer@0.1.29-multi.20190810043746","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-+sq6Wavd1A5XGnSrMBUcljJ/SJjYNJG3pdQKD+l/IEJZQCR3iTPnBbImkC/2gpC4jf4E9AVdP9GVJFSrewIFHg==","shasum":"da3036ee1d27b8849ab1ae2630b1c559b83c5384","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190810043746.tgz","fileCount":341,"unpackedSize":4284557,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTksqCRA9TVsSAnZWagAAHxsQAIsb808L3dVnqMtxa9Cd\nxVVlcsEFClgYb03tDUaSWGLlLMbfMAiVrOlyie4RDWXCALCPTlwnzPX7Ap/J\nDwFenwJpwcNLmyfLl7zu+LPK95qUZ19wspDcvn1uXI8hvf7XvFWJRftVKb4w\nOZHMwwuxVTcMluJPoqU5KV0yC+OZOydnFhUgvS+he2Hdyu5oLmhiC6+B7GXs\n6/Gr2owfzajItt6bsU/KhOknkuusfI+hmvMRM6AKq9E9R2ciIkr2g7bbQMw5\nBp6lbKKRWP4kFhBp4P0Y1iNEPgn38WHdmohuPZ/5rrNm214xpGguynHrfi4L\nr3imMFVkGObBfeZ3bdKAaWwX06EG0jEWXxP9xTxSAZarsN6LUGLe/9VT0Fgy\naFWeWXhR7MrAXs8MPYA9UtnCODRYYKKc8S4Ufnv2pQzS006Zp84u1ZwJQutk\nlhe0ClExcdSgx9zt3y98TWAhg4A2537BBzQvmcyr4oiCeOWAdC8pUwotftge\nHbwNMT183zqe+SMeUNMm8S6iqn3q+03AoQC8XaNfzJ1jEriM7/7dU6NqN6v6\nO/Z/PsaX2HYbDg+n8fnLBs6gfYY6H4G15kFiVGn0DKaealuw6OmeMMljTUJA\n/xD742yUBShBAFSXWD1hUYeNAfLVoG+AMoZCBk651Z2vpk4oda8jvzgJ9Mm5\n7BbP\r\n=VVlQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmSkvs+qbtIlWW7eldeGlGzhCwrqm+YW/B0b1B3m3yxAIhAKIxkTNO+RFu0PIgZFB6inn0FLWv9WAMRCoDrhVk+aPh"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190810043746_1565412137827_0.5424355137710977"},"_hasShrinkwrap":false},"0.1.29-multi.20190810064956":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190810064956","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"86060c31279bd7609e17c5b02261dd7ac2b414c8","_id":"@atomist/org-visualizer@0.1.29-multi.20190810064956","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-vK5TKtOCQAl2WGa57QEvRxYpLhE3XsaiK643nBZfy/DxH50fbsPEcCmpm/1g2Ff5JPRjonsH9h/Y6HHosqU3DA==","shasum":"ba387e262658a45b9b22d84470299c73f72f5b5c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190810064956.tgz","fileCount":345,"unpackedSize":4285475,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTmpFCRA9TVsSAnZWagAA5dAQAIGljO0pQLtshpCQOqB6\nK921P8Ccqz0Yoz5KeCvQu6HodFEz4/yQBsyH+iwSSADCUr3nVFSj1zAyr2Tp\nL18WPhCyLTvqyWhwBhlqpNMB1hQkWennTnKsFqvxI6/cxBdN/Dlxa798He6+\nHQ0m4w9uYWUB9QrEmSYLt75YCM9ubsSD0NWkqD6qQ/UOKpBZiCysHLTqJJk/\n7wazN6F10md/6lUjtPfXFjMYX8Cj4l+is9G0N7Y5v2+EMciPE7zV+EIyKK+9\nZAqQiP34nbT91uTjS6z5PrLt4BfvV6milxnMiF2Apxir5V67IWvv8MTp96XT\nQeUWymN3CBYB91OkmZwaG0yo3J8o7BJe2l1U5SJ49qpxCQehTMyv92chiHV+\nYXlulSQqzYr+YbiaN22emIPRDmAfeKHbrEStO9+nnXrtCXI20SQ7nDq3VDoA\n1o39of5875v6CzOn6ZIHWQmP90V7YxeDzo7Q7XG01y+xD3pkwnmQT0rl6wDc\nIKFzeRrUSYMoamTJJAqSuzSmXWa4cTQgJsIsfmSg/iN/TLlJkKnjd6i25Fem\n1Gmk/sJEgg3y6wJyM61xLxdxCbvLivicAM4FY/84R7Hz4c5mwMtD1n4MNpTB\nD5xXlKvhGSiI/ujzsvCOpMq9gxE8CPofOZuQDMcfUZZg/ChBdcOByiyy5uNh\nliFO\r\n=VxN6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+wklM11cMZGcK9qRzGvabspGNt95Nl4JB8sGAPCzl+wIgYH6bD/ZPlH6wamy4JK1vkj1hmiNqtfW0cfu4Cyvw2tg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190810064956_1565420100789_0.0745384355153369"},"_hasShrinkwrap":false},"0.1.29-multi.20190810070722":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190810070722","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"964a98459641a1734c47bb66e36e552b41d70181","_id":"@atomist/org-visualizer@0.1.29-multi.20190810070722","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-NbI1VqncBVOc5Iwb6lg3OfWqKNrcjK/zWVYkgAo2zl++tQM4A+t5Buk1EYVwbV2S0+YoNrTBx1OafVOkGLtS/A==","shasum":"8562497f7d7c727524f39c9d53e7ad45b72419ee","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190810070722.tgz","fileCount":349,"unpackedSize":4291122,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTm6ICRA9TVsSAnZWagAA4hYP/0i8akUgNgciXjU1l063\n8nBDtBBYJ/jXxOIYZVMkd8g6MW9rE//8qmGgozpvISddSggXp6SCL+Ar0FqL\nsL4DlrMnTNuGVWNoMI2hUgk0qSRpG3gwPH/GrsQKROOABMfCUgV/vkJG5+nL\nXSYtbD+EuQcUKSMPo8miXlHBZ0g/6+wiF3tBOikkm8o61/pYEW1hF50cbEMX\n9CquOHfoDM6LupCUHv7j01D5DmHah/cUAUh1mMYh10KZbtlfBvZ+HlWkU/j0\nD6h9Nk8iun9x4Jg2H59Wo3eCPdv5WeFyNeDKA3b3qzptgHN4zikHJ1267ZDF\nflWMC7JS8Q4Mva65B+0FGzw/tFkkVaFICheK9hQdDfb+OxAYGHTKh+ppszAN\nb6MbhZWANDewzDnYUWLhU9CNFyHmWdJ/ZK2k4aVLtmnjVQXJVaZmE0a6oqq0\nrIn9tI5X+LC0rrx1GQE8dXAs4/qPGf7vPOJ/52Iv/+bv8Qhu/ZDKyPRMIN7Z\nFt8B0f/H2D3yJo0kJ0SARi/Svu/WeDdmcxoB3NHGJ2edhhYqswocDOmt8Tnp\nU3v0uxxBVjkOwrC1iYVUScJcYkOAYAWkrwXFaWCY/tiCvatWPbUR43OxMj96\nlClS2/KRbEY8X3+IhyLz2knpbge7Puefk25oMkZJ7p/UyYyIuTmN5AbUXoPe\noVCX\r\n=5tI5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCs7qhrNCH3eTuxzfodwfAKSfbWRY0EJFeVxxB0OfilgQIgPO6duyfB5tRPh7sbsHu5r/2M3TG09JQUI7d1SLBCjHU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190810070722_1565421191738_0.002641372663085839"},"_hasShrinkwrap":false},"0.1.29-multi.20190810105425":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190810105425","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f24a67405660eb1164330966eb48d1908a9d7a36","_id":"@atomist/org-visualizer@0.1.29-multi.20190810105425","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-FnCWuNtc/StpV13uOcf0BAMNGzeafqrVaO+SfAant0fPh3NcG2t95boLIU+9+/TcsHISWvVIE9T8i5diYUpndQ==","shasum":"f17c639a547edcde915fe605b30fdfe8e861a2ca","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190810105425.tgz","fileCount":349,"unpackedSize":4298413,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTqPPCRA9TVsSAnZWagAArhIP/28gsh+BH+cldsJbLils\n7IMKCGd6Mao0K4boKojmRnZo6sXRIE0J2jjhxeGjTXZSo7yk7cBAvI++ITaj\ngraVN1dcJyHHz+UKpjyV6Z/1ZqJTkvz9kY14Ez6rQHVRqnp83P0SUflB99q/\nGVAA2nscgcwV4vxK9dxjkHnWd/O6UNXbJJRZiwsyO9cSi5lXPE0qW2D683k1\nz/PD8N+vh28+FiYpzded+PstB9QItRU1nis5RrmNLcOY91xgEVD6yFlOWohl\nphrarTZYRWpcI4r282apBrIMHVb8WnVzA/bSy0lLep9tXoljHZfSuA1UkgIk\n4gxvB0irerGOu0ZuGO0YJkkKSgjZ0OlU7LvdhzBZLL1KpemXRqNPEdPcyTuV\nRGiwddNcwzklnn+2YgRiR0X53e/cnzJB52qLA2yp1iRjK5fRr3665zskTl0p\nS5B0S1flr1CsBwMqQDJ2wHMt2J7Oc7KLVaHX1c/ZkmtrhFGx2eNwpv7yshfP\nJhyZcrSmQ/YNjvPk4soOj8/1QrqXTcHSWG1b/X4qrHnkVfK0yF1XC/L16WO5\nebb6L3DhRk6oAW0vogtKu4CiCSi4plNiKzl3iJWu8CpIQ7MZQ5JwSposHbL/\ndYerHeyfjsfTGvO/eQpq5YxD38g6xYGsotq8b4OgSzk14x/iI+TBFyi6Q2yo\n3IHd\r\n=Y/g3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDpTE/heEVzbAV/WpZuDNINbFh7VNU9+4ZYB/VmqHYhCAIhAOl9lovBcEqe3e6Lk+qPcew4ONMdRCNH5dJgRMD9pcIX"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190810105425_1565434830407_0.13090754813438354"},"_hasShrinkwrap":false},"0.1.29-master.20190810163153":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190810163153","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9855db3bacf52aa0058b6f27039ca31e4fcdad73","_id":"@atomist/org-visualizer@0.1.29-master.20190810163153","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-zaHtyjNiyUpMc3SKr7n7zCyIyUt9uR8K6dpwPEwOuyO3UHGlKRkaXq6aQJXPAhk7sQ7Ct3AtgJHXDuveLa4Gqg==","shasum":"78140d798c4385429c10aa57936c4dda296c69b2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190810163153.tgz","fileCount":324,"unpackedSize":4248591,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdTvKiCRA9TVsSAnZWagAAdbIP/1nu1dqUAOprxrr1ywSw\nK4YAF054PodMJGJKg373Y2Hp8wUzMid4+KerQ4EY43sAoi71JLVOm0IM9oN5\n4JoYWH9sxBGyko31kDAyrRpfrfrnX3a1kQ0dgGWB30+BhAN6df5easnl58hB\n8CEMBvhTKEReshzTCY/4FOKjQBpHFbNc0Aq0Y+509CWxP1xLCbRTD9PVW46i\nZXDiey/4uO3Di1tXecE9sj4BU7c85nWwYzQl/I9gm5ojpYgJlEhGt46Mm2QH\nP4px8zxP+0+kKgQ4As5PtQD80/wgmd1tl+d/Tohu5dDpgEGBmnb3L/bkE3dF\nlW2/aK43isARydioG8AdXPAWiOkKf7w4CMN039meowBMgpdm7LR/gFCEI0Q6\nf857mm4cs4psS8ndFYw/1BLegOIAaztkEPzYeGyAfVds0U4FrC3mnKxHxvR3\n5tyOkSgTeGLhLkTAHblJZu9QQDm17sRAzdyi9iZq+hcYsbxlioWNjj/g0Ivk\nnFlvEAxeArfR0gB8Scu75DuhOPy4n2a9h8wgQrPvbSof7r/JJ+VZb5fc/iBj\ncDVx3CbMXFNrpDdDpHdq9EdM8oZpHbIcs5x1/FA7BPnFYSP6ee12LExdBK0+\nNvkyZi9531zFnl4CrGHQu8yDX1Han56J8g32EPWS5myF4esl67g5zvozB2k3\n43xQ\r\n=a0aE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICk/8Zil1f7jlRRdAVXYU+HCW7AErvpZzjBcwW0k8ptOAiEA058Seg6FLt4kC9g2O5TAMO+V13wo5m7a52mvpWRJeA4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190810163153_1565455009613_0.7502982323010745"},"_hasShrinkwrap":false},"0.1.29-multi.20190810231206":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190810231206","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7935607ebd0b7fcc4bcf334734be3726eabdb77b","_id":"@atomist/org-visualizer@0.1.29-multi.20190810231206","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-FI/xShFKYPccvINSlaTMEnjNNwBbJy9eGG90GwA1UaF00I8pNC7Xbs7By1XAH45vyh1NM9uyBGmSZjmWRV08Ig==","shasum":"12b4400faa7bc842e2ef52fc1e75e6e42952a7e0","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190810231206.tgz","fileCount":353,"unpackedSize":4301435,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdT1BkCRA9TVsSAnZWagAAi1AQAI/xdECJSraUh4kMYai9\nEXxN5/tqTJjhcRLz3aDJV0JFz7pDky2ORPVqafZdiKf8hwhrH1q0OnBL5Xp8\nQvG+IyDjkRJnDV+Z0yyIYgdFzYIS6rvzEnyu6kBYGnBOizWcNsaTsYopQZdD\nxRlsLycpm+trqJO57xqdcApmpTHWEPP2W9E3vK4iOw5KS7+LmkaWs1cPUq/E\nd5d5PRT7vr2EcMbJJJeqsqM4c2XO5ul5byXNbTRBA4bRz86Cdj0v1JErJ7+b\nTetfSr8ssj/Xgz7cbp0WTsD6Amz6hDMKeK7Z9FMvxQLhghldGVyLHy1t8VXY\nVyyJqlpx9iXw541O6pISOLfPhVH0yKpLfzyufhn4UiGfOAWh2OFFuXavtJrr\ndxZf5vqgN3DbElcTLztrn6LW79Nareg5Dt2GlPc3xyD0vzmurhgZouJ4pm/8\nbuvLFxFPSFVuE1D7hGe1Wxi9rKiact/3zhSWhwS8B7uu6Ed6Ov9JbRQr0Ghg\n6GsBYKcj72dYhbr0NvOpqJrVsn6k3jEO8YHKfAPLV1YYGjvE/Lz/MZ9Fecg7\n/xJMDAl1zQEI1YFRVnHhiuijoCulSr+4HCmGxFZ4/avO3AdIN3FtQIiP5yfc\nfq/1bMeBKLumxEjIViBY/e1sUvOly3RlqGZvSid+td7nSrA4TM/81cJlzWtT\nhpLs\r\n=fcbO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD72NcORdC/XM7dSi0veUibhXvoQNjpGW9O/gGuhONOqQIgHGfeDOEAd3f4llWx9PBWh954zJTBj2FIDTyXu/mqKec="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190810231206_1565479011802_0.1560332678743679"},"_hasShrinkwrap":false},"0.1.29-multi.20190810232338":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190810232338","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6b702f55ea5cd8a4d4f45bc70562b6e366f197f5","_id":"@atomist/org-visualizer@0.1.29-multi.20190810232338","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-zw9wukKMqtd+BNBJWPPVTFba8TBevFxnfhgdMHqNQBpJF4HvStPoXm+sNiHT+OXu6ilAGK9qKgH3+W2WGIGhYg==","shasum":"f2e57bcdf6f05da6ef598241eaa6fc8daa4d2b8f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190810232338.tgz","fileCount":353,"unpackedSize":4302236,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdT1K8CRA9TVsSAnZWagAAfocQAIkax8eDckV+6U5nT8Da\nNouGfbFglomNEg66PwhUcJdGCHUjdV/091HWM87DFSHaJ3nBFXQJaUnHL42n\nENdCEXjeQRstXmoshU7i3NQby8bobx4rzKjeDzWAo5iNBMcf5AMy8BAltt2K\neS+qsY82bjwjFo3djKNnIm1hCx1SvNIsViBnRbiJ3qRS9HZZsBejGNVX9FYR\nT0ZSa97zNSRoo5K117eZFWl/QZf9P+Z17GXvB66zLs5pH7XIoLvVHs3b0LJW\nTOIjGYshV/TVVfKi5XkfFPkvffeqnSxEUcP+vedCGy/iUgUedhYh80l3H78v\nixKWnk+GPPHpgsDIXAbmbsVP+7pJx1Ed63bxDlUjAFkimpprDz7nWWuuF36I\nHM0H/1vDWv8LAVgpnBuqW3LUYPhc7BMRMa7Hr2vVvE42xDb80DgF42w2267U\nuCMGth52JOWApakwFzZgmqDHtX2lC4IF67VyashS196n7FMhQmtzDEPrgwtG\n53rh32UBrGonYjyBe+ukX9XBSizAK7/ccXcfSMIrc1i8YYxIbaFVJwrS+xXb\nKiYi6ebDwGhByfY7pKe54Jro0DfOMhqz4kUGMk67EVD/k2BbFwSvj9KOo4rS\nH6sh5uUMyvugFbQkxr7ByFRU3FBvNUe0rEJPZ/jIDZKk8P+5wV6Rz5Ye2SIE\nUpto\r\n=ZDuK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICicfK+wD4fQPWxH/MejoU2gejkY/EBCzGITHxuN0fNXAiEA8zEljVlmd23Q8EjE9gcY0L/+xijelddvIUvRZKSHn24="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190810232338_1565479612084_0.4583691702544215"},"_hasShrinkwrap":false},"0.1.29-multi.20190810233201":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190810233201","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f4da61ec301e4a7925c7ee9ea920bb6d75ef6d0c","_id":"@atomist/org-visualizer@0.1.29-multi.20190810233201","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-DBdIxJS5G5DUk/MT7Cc1kdx+qXAa76KWSVyz7ve0RPFsGkXhBGlhsoLW7o/w2mfQ2O7DuQMPe7VJEroEFhllxw==","shasum":"ced24e02e1f5701b12a2b45f612a5f6d795c376b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190810233201.tgz","fileCount":353,"unpackedSize":4302924,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdT1TNCRA9TVsSAnZWagAAodAP/25mi5/K4659+L37wK5z\nCy+5bNFEPZ+PgtACp06ewyDxQktmfpXlnpbYu6Gkh9QmhbUBrao8HXtcKTU9\ngTrg/wWa9IeUBW6I0oUsJZmTYfQl0cCbmX83EH4nj91QsHIOn2tpRkgSsEgL\n/5t4uPfisDSYnDDmzOyYFNvcCSK9Ia1hKSsRPCxi79+PkXES20CRBErspfKd\nLnF64kLpbMSONNsXNyJu7WlZ6qWKF/2xocGucIY7UcepI07f/2Wp8g+4VVBg\nlckz159pAA3RijrcWRZVPLlr3n4qTsjwFE/0l0WbF5mcYs/oDMX8oUl0ugpy\n3IoGpwejLh755Ge+3Pi9FzWlMnPBaGe/3eeLLAkSJLXojctPP9EETBfZhkPp\n4OktrDqn9eZG3xoIoertMdt1N+wM0tXIvaktnu3+6Y54Aq2YIsoGeu3JCKgG\nbizr+gV5lLq+2kauSS9AxKwtoAAYMQjExTcytVzyGa5isamrhLjnbZHclBom\nf2Z2juv5RNMJKaafPkihAKXB1FihelAnlLS8lNzEgyePz3khZkBA5X4M9Ic3\nMED3u7vZkdsqQvviA45VL6L9gaP2PQphgFmBAUJrsWZYRajehtre5QcsXOEE\nWMsHNP3REs6MWZYlnrwCxkJ9DsMB9vko7swmQNQLoqYhpAVaPrMhi2hr/2lF\ntzfL\r\n=p3Qn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA9PvQVMt38nsCZsvvDHw0K9PBRR1tSChxYdcIU2/qCXAiEAut7L+lwV9f3hkDvRQycZPoH+ojnk+PAYZdsnPYBCtco="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190810233201_1565480140572_0.040494848155161245"},"_hasShrinkwrap":false},"0.1.29-multi.20190811035916":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190811035916","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ed503424cb2964c4cf2bb40640d4861b731090c2","_id":"@atomist/org-visualizer@0.1.29-multi.20190811035916","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ojFxPLgB9tycXi+jAimNaC+nvnJNHBWE3BlMXrZWs/o7RWzOpcMNHye1cygYWq173lMlax55/Qsy8wWHQShkeQ==","shasum":"a79507d41a90d7d594423595ffc916412cf52a2e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190811035916.tgz","fileCount":353,"unpackedSize":4304517,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdT5O/CRA9TVsSAnZWagAAuOAP/jZv/r+jPj6jCm3zNAKU\nurO+Aw6z6C5/ITaCybz2VO8fNW44sjD+3svuoQay2YUvNjovN7pkMNIOGXaj\nZBbzNmHpGWM7tdtJTfZtN81P+QcH+YnlEH1IDrBFQ3CjLtSN2fZGXFMjalEG\no6E6f+3IdcU3HyiXSukbqd86qqT0vDW4UOGlWVSp1Jt0CudEAwr7pN/I0YMI\ng0D93AjkmKDdzEPuWI7WqXO+riDPAYKD8nT6cGHo0Fbfw70F+SmiTsSeoui6\nZXgg6VeMPdpLkuqvhP5M/uRUcT4Qfw2TYdazYlNsQENmc9Dys9COwH7zhprt\n/snLivuWied7yaReQJk2H7oaXE01OC0JOsqGMA+9aqgvlod1G3FjzQwtN5Cz\nYeNheD+LbaWZUpZKKs/G5BJNW/XO1KMj17yEs1YF2+gHGV1K3VBxa42tVYpf\ndUlzoeNBTnlP+yqT68KZv6uNDSi+KFm75Rmq0uWLvMe/PKLs7x2BMwT2Ulc0\nWA7RJ/kNCx47iLNsCQqFlJckBc4ChVnbIVoHnaEBi+UDB0wJhbykPhjcHDxU\nq9LaihOIIIU5bO6w4FksSL9UUdKYTPzXQnqakemfq4Zyeg6DAC2t/aiXA8ha\nFtf44Gap85pjT19TYv0mpcGM9hH3KY3Xf3/xzpxKiyOAQjgqjiykyrvI076+\n+QRl\r\n=xwEk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGIGEUorXqzGxL29DznwFemovNDXqIEsTRp0gYloFA+EAiEA23o+Y2uSrbKDgbn9gV6JBGCLzcdBGTWPgZNCXTDpXcY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190811035916_1565496254734_0.9683308948100733"},"_hasShrinkwrap":false},"0.1.29-multi.20190811052354":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190811052354","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"dccfac7887e4f06e26436a9ed789f4acba916fc3","_id":"@atomist/org-visualizer@0.1.29-multi.20190811052354","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-LCVcqDx2OGjxvCEdSYFx7LA+bre1p/zuwoI7KbHj32guxJBaD5WzweC79oLj9hv0kLyCnZuAQnyqaQ2GD6u6ow==","shasum":"7bde905996f0945e1124a67efaaa19b7fe387d6c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190811052354.tgz","fileCount":361,"unpackedSize":4315347,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdT6eXCRA9TVsSAnZWagAAue0QAJQbZC6PS0BGxhMv5pOF\nQKQsRiQtv6PBli25ZX5NMNcgVgeTqJPye4AyCdsiAstwOqvFil5VKZ+qAXTG\ndN0dPSB5JaK8p+f6wzxNu30PC+CJqoEGyYI/b7P6lLBgCIK6IuC9ZHLXTyZl\niNdcFThdZTdPDmV9jeGH9Q8pPbhgMrLn0n6RCVS8H3/1RH13iEA8aFwp33vq\nJapAXc+B50/+jbIv2c2OwFrSeIFRFfu7ZpY/5+v07un50I0qngYx3UD3CBjo\n0b6oBYZeJ5cB1hHp42ua5b7mCHfw61LyadtsvAy3fSnXVwYTnmovkUlVf/Gm\nPasLrTyF6QDj4GeJGFNq5Cqyc0YccYEjhNdVz8BZLuXnJIRqj6ZomvuUYq8J\nbKtQjQ3UaLpR0i+eeAl22beB23cqQxFlwvkAo2Guo10Q68M4sMGnyIgr8XEr\nkJgBxoPkqHU89Y9b9BklfWq3ld2IQAcbpXxA/+WAqSpl5T0fnZ7TBAe5IA7J\n67GP3W7U635DSgaWhkmCkYqwCYMUB3uuFEgumg2QWIrmHmnR/H1okTbfUjDB\nxESik40f6eBCnPeJybgquP6pXsHjzPm4MkzlItkfLSO19DVRV4AJKBA+UCSe\nMScme9NqLXp3lZLGNCMZuPVabU7jFI8z4xfA5A8lVQkPl4tiMklzit8ahAFM\n+RoG\r\n=QCoa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCbQ9zyxXIHP5TTtAcvAjMkjVphyD2JZQZcVBER4z0+UwIgL3xZrI5FkO2BA0mNyqHXNxM+pWC1GdhANnjZC5bnGDQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190811052354_1565501334306_0.14505330693153407"},"_hasShrinkwrap":false},"0.1.29-multi.20190811095533":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190811095533","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"84be560534cdae571ee07d308b79d172835e4a2c","_id":"@atomist/org-visualizer@0.1.29-multi.20190811095533","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-w72/gEH5n68Q49M/ei9Im914M0F8JLUCl2un/ZbgeBbJQI+oY9gmUW+6ojPtZfBAczjK30aFPzLsJSVyo4+8wg==","shasum":"6fa3803708b3066f4abebbebca9041431e7aef5d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190811095533.tgz","fileCount":361,"unpackedSize":4318915,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdT+dHCRA9TVsSAnZWagAAmM0QAIwBa9oOa8Bue84yDp18\n/I/fB+2K+k+plmIPfi8FM+bfTlmFZTlRZ9tbkAzl3Dm1oOm8v0SeXszcm02d\nPRmMLfxvKrZ6Ykp224zV0HSUBUSbVJzUCB3iGt1Xko7cCQU3vZZWOf77vcCJ\nUMCS92XFGWV5/CYf3GXwn3/wjzyfErEelSiax+u6EDfcurCYJFp+o39iNnn4\nYCrhpCezmg78MFFH9wEe3cUSAWzh38jZ1zaFWVPLpJCixZYyZnQyDeJcVi5p\nIItY2rSfW519A/d2iePZdHPBBH10a9PfO3ftsKf1f9py6YEwYVy4NvruYcuD\ndLgFq4F4r46h/7vGggtFuwxSdeXPavT8sOJb/oKU4hiTMHcfy6+v609ztzq5\n9X+KYDebpaN9B36QS3wIBQAybdRjkwwYD5YMr7GgSpYFdmbITbpgicW8/boC\njEjLQuDil4eCVKVA3ZPbqFz+AAFAwAuXQ+gFypKWlhCNMMxKX/1yMtGAb9Pr\neUuAV1mq44GsRey+MYKse/vNTCHRPJSP7x/pqPs380MgL7kVx1b6K+lc6Ex6\n3+KC7vuV+cUjqERhc16MeqkrLOZ9VOGds3NRLSX6ihfTZCNpGmGfoCh2tx5H\n5Q2Gl6aqLH2pfPEN7/6932HLShoL0gfyly/K3M/5CkFlNkMYKEHstJBZIEq7\nt/c4\r\n=0asl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNU5+5IPGGzwF8Qzugrx2nk7QrrMMr89lBl9Ap+LZeagIhANaeCLo5zOTI8hplRR0wDlp2Ddosw8TO5bwjGb/1jeBG"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190811095533_1565517638513_0.9346322644426435"},"_hasShrinkwrap":false},"0.1.29-multi.20190812080538":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190812080538","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"62275ef9d6c973bb7b9d5d6c51270218e4bcad9b","_id":"@atomist/org-visualizer@0.1.29-multi.20190812080538","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-BZ9ILGFiZYGepDB44XUEhfJz6Z8tnqwinU1ZMXw55u4ZEaHgwsGNFb/i2aM4mO9cxE+Y9V/rpvt9Wu0hu8AMmg==","shasum":"029dc5f4225a19337d6bf61b39c402eea7dd13a5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190812080538.tgz","fileCount":373,"unpackedSize":4334060,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUR9rCRA9TVsSAnZWagAA/tkP/30yzwahmrlEGE6W0m0c\nE6tdtGVKacXCgky8Pfd7kavzkq9MF6GfzCcnOUG3c8ZfKV+kWP+qizWZpmLv\nbHbKqGmSZ7m84HEUA5Pb3tkegHHc7uYfSZ4QLRteOziMtpRVgosUF2F8x6bb\nOb1ce5YGqSN6qCGPrLcISgbGY6ND5D4hiN1MdtU22igmcgNa8O/uXugm6VBr\n9yOtI6DRXtSBPC6eHrTSPAK1SBVikP02vDi4QGIebm4gzDf3fbiWaNWxZ9A1\n0tpgs3ZrWKDX3jcm0kO9U6UBSkQyRB4fsiS+xEqc7H4jOmCLZv37xgz0q/WG\n1W06mCro18xd7h1DcLG6lfg1MpaHQjYV/hA7ZmCxM8vbq458r9XKyFL5trtY\n1pG45vpzE8xap4b9ipYY3+w0gXyMY2eImI6ZLJHFyZy60r7r9JDm42RoQv/t\nhqgqoVrJmTzjN/SzRzAMehHPLpBsTH3HpukUUhUI+0T5FuevU7Rp+DXhMef+\nfSH+n1QjxSfbQ4SuBg8xeioDkeGdWWiFSt8/jNmgL+6VHhOmBGAtEBSo3tY0\nKknzaCiDKv30V/uhaAhUjO33UslXiDFsp13Hs5xxplyFIYs4Mr7+Vno79tg4\nQyMeyWGoBAAJv8RySEDuYIfe4/JYoGAwMCH7X4Wa/coO4MRiwWAV/0iKR2MK\nqsqC\r\n=aaR1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDCEdm1jERxRQ0AedI4LPWJ1VC+YHi/d7DgqGDfLy0T3AIhAOe1CA4kdNvlWRVN+1xj4MmWYV0Vh2gt3j5K5XALlNbh"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190812080538_1565597545769_0.8011612534139441"},"_hasShrinkwrap":false},"0.1.29-master.20190812080859":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190812080859","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"2.0.0-master.20190717103823","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"4.0.3-to-policy.20190803085459","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e896d58db93cec1d1d5f9689c7fd0e2e272a9e74","_id":"@atomist/org-visualizer@0.1.29-master.20190812080859","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-OLICsGihpCR5hV3O4BJtNAPkCVsnQun/XcIah7nvpqedRz9lZ6/hAgxTBjh80KNyQheDfsl1kGFNsZ4hr86lVg==","shasum":"e3e050b017bbdae124d015aaf1d7dd7c0686878c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190812080859.tgz","fileCount":324,"unpackedSize":4248591,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUSACCRA9TVsSAnZWagAA/OIQAIwCQrel/YjTivFlsgDb\nyZfk7bBOdOPVvaNBfcuiQ1fvOrEfhMpHrkXOP36JZBoE0oZUsNG9Mttgssw0\n8cHiCUgEOVLsjl0gGYXJ95+u+IjdmdIKqs6Jyi0qNRwpNA5mNO98VvupELfm\n3r4CjWexyK8HgtPz7Kb8Wd/bhn0gGWWCRIALU+yM5XnyrvALIY8rZdcpaa4v\nTO2xQqVdQWpXj/EvUsrn6zCVR8jP0J9aGViMq4NXGbPkWJBxFxkcp9i1ihxv\nOF9DRfLU/W/znXzoPYwVgjDKkIf87uUg9O8s/Y0wNj6HNaYth6RoWzUGd3sE\nlcfPgtuLXGaOlMQosrMA+mHmWeNp8GPJFpjN1v0YuFiO6xa2FPiXzQ8c3Le3\n5u/Ho6zaTXdCow4XOheLl9PO37OEnaQqgaCwjluuLV+PA7Cmu4Ai2F77ADvF\nk7TV7fUbrwdlLIesAXpMSvaV6IRteoYYBiZn2diH9AOaHJsv51pBaJnHS1No\nrSWKd7nHAR2cY5T3RYzaWHeKKtHNYy9Hmuc9YJVRSeFexcV0n+4ooHx2eSPm\njVGXyyFQwvPmGn7tZxo1DxRV9aiV6rRvUP6BgcWC8JZ7V/ldOecD/2z1+Si7\nBvN6wQXsHpVKV1+MshQDNsmP0aJ5fCUSjsudNlJNxxWyL/gOn4h1ZHld1lST\nIj2U\r\n=cVZN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIANidMA9KO/SLon5Xlv95YJp33D2+zhm2nHXyvPCLOJoAiEA6mB43PjEWxjZzBI9N6P5TiM2tCcyT2ERE/wosxER6RQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190812080859_1565597697331_0.9342747532096589"},"_hasShrinkwrap":false},"0.1.29-multi.20190812082722":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190812082722","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cbf42fd7db61be752720a81d07e7aa23e255a28e","_id":"@atomist/org-visualizer@0.1.29-multi.20190812082722","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-hLmlJB0A6jB4/eYOA39iSO4Yjbn91rUCtsPrD49BA0XHaKG43fEmgy011/Mg1UQcPzHsbCz0pEbDU3kCuLyCyA==","shasum":"11dbafca03e666134197058a856d50472ca72826","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190812082722.tgz","fileCount":373,"unpackedSize":4332906,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUSRqCRA9TVsSAnZWagAALp4P/jb+PTpKnU2UPY/eaFIP\nWbYsu9DTeJ8LNRzyXSwXjTlSZ+7NfeuOr5FJFfc8ItGo8TsD4600gnr9eAwb\nLTpAE8/Fbdh9lWXBqnbgdzvpUASeFmkTEdPQngMlXLp8BcUO7jRK6jdeXxcZ\nbpUNFBAV3y77SNP2HDNIGAVkrdW46PQ/ypJ9nB0et4SXaCAElh5eFeoBC2fI\nuFgQs5KsJDhMOqMkjB+06nNcU3us/QgjtaEMcK6Kln3RZWxO+NvLS5VnkCoS\n+HXY0jlSjqwMhmfaauQTbPLf/QqpPk/sfGQSn4Kxjw4FFwnSjWgiTywgOoET\n8Pm0SO19TBbDJ0ArQZKnO+H35Fg9cKDJHLtjrtdo8SuYV3VJUiYawo0F6iBR\nlBvDCbmj+0GWKR3IwKy9IO8ejUeTnr2oV3qVuIAUpunOUgoTTiECFdpu64nQ\ncT946TahN9MsPFL9a9WD6zhvVs31/4yMiE3eLz/AVXmlZLIiYzIVzW5Gk92w\nqBLRIs43eEcP3sEpnXmii4PLn9Rkd60Z/HA47iD41O7/AFrQv8i2KcTINWZN\nSRJpAVAtk7uUcHFMjxw5OZTeE6Yn1F1gxH2I0Jl5GbBzXGBF7kNVZPRBttdw\nPxIYW1BVKDfwp64BzvehmD2zWQ5FBbJOWqy7o71iP3XZoikoFIaVGQ3ZqkOf\n6ozO\r\n=2AB5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGrGG8V2QBgZhaoqha1JggtiJy0dVuW1HSQmGX0cQLQYAiEA5V35ww8LZwK6/bs6PZhkR4qSxaXyCutQyyqIySo6v48="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190812082722_1565598825239_0.5900125022945626"},"_hasShrinkwrap":false},"0.1.29-multi.20190812085505":{"name":"@atomist/org-visualizer","version":"0.1.29-multi.20190812085505","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"^1.1.0","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6620fdc4e068e44f57b0b55038e2b8613f19914a","_id":"@atomist/org-visualizer@0.1.29-multi.20190812085505","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-K5Xd/45XE5gNk4Sos2uEZXOwV/3gu8XwxhZbX37hjZ+VOFSIEP0t2/lg1cdAURLXucEHWKpK9tDE33APYsygog==","shasum":"5dc280da5fda814d81bf18d156174e36b43ab7a7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-multi.20190812085505.tgz","fileCount":377,"unpackedSize":4339265,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUSqnCRA9TVsSAnZWagAAb8MP/AucGYYQ6WZgxGULhzy6\n4pFYbzCtKMcaZgV5/tSe4qR+SHl+57LIXSy/GoU6AwRgzjOqjwFPx6Hm8jBr\nTRTZW4nxThqT4jLebPLBqPkIXlj0CNmAQ0Pib7NtizTiHsr5yjMG3BIqWC0U\nj4rYVGpTdF9/HsbbLqPYBKXf3Ofw20kqEkk8+QAV/FpsXa3MCvT6Om+putVk\nelYN4YxKjuQ+eR1cZF6zfa0h2fVnrIYhh84nLwHgeI4T2oWiuLRA+RW41TNo\nAeihzpAQbbeZzFyNsSRyZRvS+ch/v67ncJ8P/j/23R47sCzutKMubh8VVJIn\n15Qlqhv9HhuXlxAypWtQ70xFxwZQ2lOFJdRBfLvDKr3wcm105ZIpI9CeON2s\nx/or9UlI5n8z38bWKaFKsuvkVcutW3uEhuA0N/Nm1ygOSsnjm2yAWjyvt7VL\nM3VRmQaiTajnmjN4Tg8FW142vPuGVcg3E5Vs6Fv4b/ywB6z2aEppcPTumD7x\nRlM/BdUi7wvtt7hKvsqX8RrzR+srvp4D9a2tRkwAbFGTVjLHix3i/2S8CN+q\nuA2dvFnz7rAaLfj6jxviAg5+wSRnaVF+yG9i5jZCEXWUhwQM4HA3C8Cju+2z\nQv2ncOLticK4C8NsrV16sPtULwOc8jXUS6jYfS1ycRy5mLDL69U0+ukIwVjX\nI5cL\r\n=KTmR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID32w4gRTTfPXg8on6Vkk/pnsdpRpp2cAcEn2GhCbRKgAiBTlM4sqHqThzy7VbcUKSECMGAIVBcnvC643r+SvC9fCA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-multi.20190812085505_1565600422981_0.13629709464141992"},"_hasShrinkwrap":false},"0.1.29-master.20190812090108":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190812090108","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"870f721a0c7664cea53c77b092194001a06c9058","_id":"@atomist/org-visualizer@0.1.29-master.20190812090108","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-4wAsElKFZxfCj1UZCHXZKoQvcw5djiXZZHP5M7w+7mcIpUtI0PV+a9Xwk7EotIhspjvUYq9F/tRh+PRRLjHxRA==","shasum":"1b61d1af631491eb68ee3e6cc986680b624a013f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190812090108.tgz","fileCount":377,"unpackedSize":4339306,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUSvnCRA9TVsSAnZWagAAHbcP/RqKvScFhf2b2ffNkJRZ\n1rResT8Dbin2BmPxqiVgVeI8X5UePnbZiwmDsv8QQzBYdNa7c293IJeuJCf3\nbHp3LDJ4J32jmDorqT78t4RH/nNQDjBMAI9yOmqJTzcQknMO62U4GkrDA97L\nWZDCHE19BpxobQr7dpN3kSu5Sl0n4MJhcJcNmMbxZ/slN1qFbZneJqZRagVU\nPFs23nj15BNZKDa8ULmt26EyHlQzeAdF6hkxvXc71I/5N2JXlIqnk1keJnHH\nDHSWU/8HNnHxHwJG5R5SGr8SGDw2ZXB6NMHdcwzPUSzeie2m9KiJQzCz4E+2\nKJr4NswVxjF+fVe2ge8cME5KZIhQXyIXTh0oZAmeX2p9F/jWu8vkkALds50F\nXBs6R5plGHHt5UORzQXwLlRk5lrpYndFlddr7txqCDJpIvxUgunOMHxnCWRH\nOnxMZbjIXYUaubELnvNw9BXCAIqGatyyV/Glj4qFnoD6JlofyL/0+XCxRDbt\nQc0naKf1fHuU2qyTvL4MbbHWJ/nffet0KzlH8MH7KeGKSQzk+gdPcVg/Kygx\nl0RrTiW7WBU7KGY10+ORWMl1jNrTZBEzBISw9HxsQTk1o1b/C7IH92MZe0mU\nOQRv7c8BHni1AWRcobfQ+nGi5tpNhZtHrPcT95ayP5x9nPnSK6MU0S/rWK9B\nGI0P\r\n=KUfU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCtULsOd02aVmUuWzDcplmCONJu4bFJErfCSc9JCTA4UwIgGpqfbsysKqLISmm+Bu6mrVbaqEd7lXnp/KCVlywNqxs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190812090108_1565600742631_0.058892278991563574"},"_hasShrinkwrap":false},"0.1.29-master.20190812100831":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190812100831","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"374cbb9a96110ea970ce387a329f7d0e0ac07239","_id":"@atomist/org-visualizer@0.1.29-master.20190812100831","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-9rUTfXzodNoiDDeBHzlGbj+usE8YEzA2wrRxbGPeiDOT+xJyU55mQAugBBb6OhqBGHEtUOKAoKAgj6CQibi5pQ==","shasum":"fdadd04f56200556cc087293d103b040bda083f5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190812100831.tgz","fileCount":377,"unpackedSize":4342447,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUTutCRA9TVsSAnZWagAAtfgQAJXjFzAfgQ83PKaRs5tX\nxbdJLKZWhSlaB3BzqEos/yAHZckhzFugbD7ZZWfNNJPo8NXTbYewLVVEu1xS\n8WXlPX8oIdfZTLvgDzcuB4saSpY0pig7gRT1I3KLunTUgIC3X+u4AmjwZd4c\nApXwOlXxXSikjy4iPtcx/1+Cim3vE+XldEINLkCF95JgQ29uBhzA4euvEF8p\nHhYISIe7YmtjE4rjVXrLZFXU5z+VPoP2vWRVbOUzykDjESHVSSfZY362Pw3h\nDNfzn10pXXv6lZUEYR6A6uETG8vLCpTDDIXknZfKtZMqQsckSR2cP9yiygbO\nz2PEa/bimBGlIHJ7biIsqUGTdNqfc5jIS2uaA35OFRcZN7L/XEJAqldPkAvO\nGfHV1pstwRPUZ5P+pVkCdKHF+G+leu457tZBVERgNnpwieUF463JpZRyP0/a\nb5Foiy43PuKWBYkoofE/c05k4WkZ+wWqVj6rYmnBH5AImcE2VukfZQ29W3LG\n6ClJ6hYN5jISfVoO7PrS/ePjGaGp4K9joJemGzmAY3+FP5H9nezF0No8bAUH\no0Mk0RjU2S8GgR/6tw7Sf+iolo4+P4NGYqKLF0+b6h8JHiC7mQIFvQugxWQo\nE1MfjurS7h4NyAUIFCyw7b0pM6BYuqd/n9g/OHbcVAPWGNWWx/lxpE6Sv9bp\nnd0P\r\n=Egyq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICl3+C/Dh1iQxmbjlbKUhlhOZhhwLcZdJxim3dWVl/EFAiBBXuFEUZruiY7LPi+u+oYJOnu5UHLlTK0a9Kg5GpIY5w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190812100831_1565604781328_0.3719611915248291"},"_hasShrinkwrap":false},"0.1.29-k8s-spec.20190812131518":{"name":"@atomist/org-visualizer","version":"0.1.29-k8s-spec.20190812131518","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e694e7f186ec94f55ec47ce6fd491c39159da4f3","_id":"@atomist/org-visualizer@0.1.29-k8s-spec.20190812131518","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-koOMraI2wRB7Up1rjYLAsWOLbSIxn7TnLTEMq5ohfAZ3z57mLIro6O2u2zCA9l8688Wd5G9KCHpqAtmHrGnygA==","shasum":"574509cfeff71c7cf528458321d758aba20b276b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-k8s-spec.20190812131518.tgz","fileCount":381,"unpackedSize":4355049,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUWe2CRA9TVsSAnZWagAAk2MP/RlCuIUKORcd97F7HyJ4\nInQAAEd6GBEsZySYuUONvD+LcJVmbIzpY12Uai74Eniy/RMsAwVzCEAo+sJQ\n9F7wE16+DejiorGKgaabJviU+LWsqURpG6fdDTTZ23heWK/bYt8tSF/C8AOV\njYHaJSNSlvSsHmK5rhWRF4IJ9C3xb+/THf4IkUuqCyAf0oDE6FhByrGZHO8B\nA+5OCzDHdO/tIhRl2A9mewGBp8zIDxVXZJKTn+IleyZEMASSnXG3VxmXSEX0\nlZiDn4Wm741NDFkoj+HV1cLdfXzu+0RIFofEUVhaRXJJzMmd37Qu7GV8Nwiu\nkk2qeoBtfyD0ocs6SM82H9Dlf5t9JA1ZmiljTP2KSF0K5RH1pl+FwVn3KQDz\nwdliL36N8ikvWPpBV9g+9hiWuEDUx3x8oxsa+iDWhhWzzj1MPflaGamoRJyv\nHtlVvsnz11m/+we9xRWnXe+zTY0NoVLladbx9zJ+x4fcMV85lM8ZUF2KCzjF\nHtixFBDZWNtnPWuCTO4SuWAOJUod9+LR1scwLRrVo5ypNkVmufc4Yv7ZGCzC\nOrPpZEyGpFZ/JNge8rsHTevSOVfMH3Zm0qDRrDNGjBjYMyBuXgkJ4ToCTiSA\ntb6MQOAoID+hO0VEemvrHbu0Jp3DC1UYfal2x91WY4TNz+SRKVexXeHsp8yU\nbb3x\r\n=6CQx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCxYnmcNBrw9F9758xZo/6SbZGrLtPOtDgjNdiXgMaZ/gIgal9JT3cfNnu22OcfnkH52ddYo0s3EpMqsNO2t5bLmhA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-k8s-spec.20190812131518_1565616054220_0.8466837716458397"},"_hasShrinkwrap":false},"0.1.29-k8s-spec.20190812183011":{"name":"@atomist/org-visualizer","version":"0.1.29-k8s-spec.20190812183011","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"56dba5220fc37b6cb215f603a42e8bebc37834d8","_id":"@atomist/org-visualizer@0.1.29-k8s-spec.20190812183011","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-cufVRhjVU+RudJkjAqpcH2VWIEQkxSvY4xsJAMSTn6Jo9Fq+s8Xd+qLodlHDVGGCOQK+OQw8YHycQPKOf1k7pg==","shasum":"400cb642471d7b290fe68c947ce952a8cc9bbb00","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-k8s-spec.20190812183011.tgz","fileCount":381,"unpackedSize":4356114,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUbGVCRA9TVsSAnZWagAAVPEP/jOSNFVP6PTtT02KF8Ko\nrHxP1i7391baVGZj1Y9+vPxsqaTveesMh2jyi8cUcyHO6Awq9GRKXW9t1IAM\nZfxTPKxhLvkMJyWUfw7y+uoIMKN1ydDBPWjd0XMl84M3qs6X88+g3Zts5efc\n7IOi1CCfqp6HoEKTaY+qmyo4fu5HpFlQdZ/2ukfzgGjHX1z78MqxL3GiEUVk\nsfOS7xP5fTmZuI2cWfyH6A+76G3pfn8UiZTBzJOTZiu3TxOEfffwDGtgGSLM\nfRoNdpzlTQbhEQq4xL2hsKr5N3bbo5YccBdneVul54CyU3uysBSVe/xpnDU2\nCUsm9WvbiMC+EAJH6tUCT61OVE8Q3aXNdhSQXYYrOt/nwWdykrPvLKK2McIY\nCG8CLPHGbXqVDl0ktp98SEh9ra5OyqBzqIPBQLQViOxNb3SzzowYRqAbWKfX\n5Za+qu+T+HnIkdK5yQtI4SUf5BwrFV6fVnQpT7rEgZi9Fdi50jgLdbkLiBQJ\n0PqQJTfLVjKwCRwjhn4JFh9GKa2FvvHYH45UTGD3qK0vGB1Xkj2sWe3RW+3c\nAb+1G9NS7ySB5KMDfmIRJA0cmrxyrPSKjUDawOjfZAMFM5d93JplhEh8XagG\nGbnrh209EYHHi4tFNz0W4BtBCNndJGmTTXxbwrANr7OQVEUqbfddXl2eO3o9\njcGi\r\n=i6Sc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDIxm1N5GZUty5xXKVu4CMi+N9sgTC8rDvkdceIQ3b40QIhAJykTW57O7fzF8//3w/VS6ubk+Iccko7O+d42jSzlVP2"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-k8s-spec.20190812183011_1565634964883_0.6026988115442513"},"_hasShrinkwrap":false},"0.1.29-master.20190812221925":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190812221925","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8ab1c0492c75003ca95412eaa11c78a052370c07","_id":"@atomist/org-visualizer@0.1.29-master.20190812221925","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-N5olIqN/iIErUCHdgZPgWJPWSq8fbVPCXDCDQSwRFJBze2c2H0Kjgm93F1aWRP37vWfgao56NKTPZEodwYuUeQ==","shasum":"2b86a9ad844640abc3aa236c08adac6c265f389d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190812221925.tgz","fileCount":377,"unpackedSize":4342571,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUedMCRA9TVsSAnZWagAA8p8P/3kUzAaqdJIOQu4joqqJ\n25fWJKbtKr6YZAuqbi11kDxzdgFW79nPt+9rYXkVcw8dpxP4mJXVamdk15oP\nMenlo2oCzwwUb32yCaDZwTH0RMt80WYdweYGuO4Rwx7f9neuwP2kijrjARSV\n4hzWoMF1xv0zSgX+79pWQNZ1MZtwo0EcC9QllkMssls3whssK6BPKhF7mjwd\nxly+m6qpTiFIp1jHc1BEoNmu2S6Xc+MstBuANDsYT3sHI3kAowY/pFqi0xxV\n1NSwHzms/kyCjulCVlSM7mZ6yN6dXXYhUnCtKuyzeQg+fkR/mNRQXEYUfagG\nUchVhxHan/9ygbrLGPd+hrGG8gannrpP73inHnmy+shrNtSMu0f/T6ngLTra\nr8CquZgtV/JYl3zX5TXl94mBPxQuzSHRdlQ6YHr9XIGT5bFVnodYEHVLZC2J\n6tSu3vsahmU/RpuCKd1hK8qh3PsM41zXsmzdClehlTsMpSAH5yBO3KM6JW7X\nysi2rErzeTX7bDOtIqmq0DIEq1KtQwFftRobvX8aJKzQpJE7lI3BKsnN/sy6\nmwRkJ2dXdPO3SKustfTcGWVPyp68vdv+DKSRcq+MTKvamTOgsHoLw0d1CjtH\nC9GruiLqkQ2ZpTjZzCbIDoLGQ25RAHWrXBIS6mhEbjcOVDYqQs7/RTuIAbHf\nZgSG\r\n=HPGp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGqTjrKLf0bzCzpSa9uVyEnVa8XixZtqe0sq6elHpqGcAiATOeySyCCJr22GRbFljrfShQ01N4u2X1GR/5I3Wd+gHQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190812221925_1565648716092_0.27297749244930336"},"_hasShrinkwrap":false},"0.1.29-master.20190812225458":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190812225458","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f2dfbb2bf5a27160211304573de27c1f8f247ae3","_id":"@atomist/org-visualizer@0.1.29-master.20190812225458","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-t2fn05ycbhdi9yf0HQppimMAgxCTzhkmBHC5HX8yZLkXPiaspPV3ztbqPQbZigV8XeXFIedr8Snq5O1FpQ/RNw==","shasum":"ed5cfd4e69cc5ed82f585512ba7f361c0a060ae7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190812225458.tgz","fileCount":377,"unpackedSize":4345511,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUe9DCRA9TVsSAnZWagAAwIkQAJbPD2zpYrkaVSvicbjB\nG9+TNGz/TVOnjGv6hQGH+GaU11sY/bM/fPo/DD6L3MNGcUAIXLRzsx7B/hbX\nBNciqir3FJQw4tz/64WB0JoztNBybHJ9bq+moUBkM3QVxm/Cl/aLm6d4lz7P\n4RBcUpKZ6Zl39BWge2JTNO3UCIhH9ixoNSeGnfkBy+bJgAb9QH7C9KyhnQQy\nbgr19ioTqfqQ2RnQLDCcFgU0Bzkzc+YN4OBvP2l3p+f5gCthC6QAc0ECHGTV\ne+/+IzdOgIoFahxzfEbh+k6FrdDN+3IKHGr9nvPkbPesskL/6K3HRA7qtfHG\nzu08SmkPTqt/wy2m+3j9D0ldvD7kvPmVCUIicyqqGEANbfkm3jy3fTBvDGh0\nq9zYon9q3SFVhq+deGDKqIHw2u5pgxa6TO+5YQPYL7C/z+bIjTEULq+KdkG5\nJaieMgJF77pm+l6qLogR7sQgNfQfx+/OrSO5zcTLCInO5mNrP+S2u5nsyg8R\n0+tp4LNcaeAZm9c2xZapGtzuuE6NuLxYiEtCb5y0f1vq+w4a9iOu511sbiua\nmFQJQOp1lZVzVp6hG7eM1tdR3aGLq70PjgRREn7Ltv04I7VYV+k/4nGrLoEf\nj1Md5g6lavLYPsJVuK8GjrkszREEzUunz6jXyrlgB6nu8hJG0LLCtNcZdYAW\nGs9A\r\n=Tb4W\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDYcHNOPWUkOB7lTS+Py8/S6FZ8rlUveD6avyGjFpE59gIhAIrOpV16ezdazApioXjNWpDTLup8kaiDKc9D/GedkRhe"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190812225458_1565650754614_0.747175670114318"},"_hasShrinkwrap":false},"0.1.29-master.20190812234612":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190812234612","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"98863b1a71473bb60cda856778e05170b15ad596","_id":"@atomist/org-visualizer@0.1.29-master.20190812234612","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-SIDk7GNQuhHMIxWEOKXfUSHUVaAz7u8riXRcA+GtTmIJhRQgW5QbX/nENdXUf8gXKje0S7Jdx5q9Ijfhk4SCHw==","shasum":"596de8ae7fcc67bff51d7b1f05f29a9a68040e9b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190812234612.tgz","fileCount":377,"unpackedSize":4345786,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUfv7CRA9TVsSAnZWagAAGA4QAJVPOYc437lGLIJcM+RL\nHGX50V+0cE3cqu/qr9vgGwtmPUDEwNQyE0C42Kbt29bHX1GXCxbm63dbWtwr\ntqc2CONMO+/UZKYa1kbeT4pOdhjN9iZyQUiMOaNegoC3M2MawQZ31C4KaN7i\ndTmtXJacqoeltbQd9jdFHa0clHvDx8dbRpf3Y3Au67oyRdGuhfPb8jrhTCkT\n5K48Pt+EsPyMuiGhztQ3LXR4C7eEKX3j2IfUWb6sPrjVc8TKhcTYkF14OKIZ\nhlh6H5TbdTe8oS/vuYfGZlX1FjJey8++ol7vNgoJyk27qDAlqNgM48uNVU6v\nXysiCerU4JPaOTYDEoPYxZNb/VpLOkXhSnDS07bOct+/xxVFC1qPc78OVJNw\nIxAxpC4ge/tpwVTHWMeQPNfqVv+IyElskAInU6xFjGW4ESAEQVHGAcGc9kpq\n2fdVUwG6pOaHybsdy6OuDGJFKknx5Rt5LtC7SC4s1C4UV6u6W7UPZ45SQ6We\naakFy5A488+sqdI1v5PB0Y09cLIYWkr+80m+2sA+hs3e8w3vxZ06zCUpiN39\nCfsKtFJ4y2LIWePCFciNHrfGbvyI66o+OvEmUu0KdK3eDB+TrcU15q49mR/Y\nwpBODeJQxAdsVAyHbU/9MoQCcyypcpSX8FUh12F+Z4kIlcEAKDZ5nreDUHrn\nrmXq\r\n=hhmM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDa7uw1XjcxRiaDalmgcJW9/vFtsZaQ27sghkY6ihL4TQIhAMi3ROJzMLRsLujxMtisBUvXz9g0MzVgkze5usEjqN8K"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190812234612_1565654011253_0.5484091012745373"},"_hasShrinkwrap":false},"0.1.29-master.20190813002555":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813002555","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1ff847c35a14b697f635cdee964ac4ee565a6255","_id":"@atomist/org-visualizer@0.1.29-master.20190813002555","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-IoFjR6SXcQ2YnhklcrEAbUQGkDDKonoPaD+nf4SRzAjSlhcJfobH9AhbR9Kldrq99Xr6/eHyo/jVa9xL73au/A==","shasum":"d5321e0e124b4eafc24925ddc1edd5ed24915782","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813002555.tgz","fileCount":385,"unpackedSize":4351955,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUgTrCRA9TVsSAnZWagAAE6gP/3h2a6Hb2tb5agDS83hY\nYBsnjIW7uRYS31CTHmyRw3heQusMP2AUesS7Y/NDBnPK91K//9mJFA95gDp7\nTFhu4y3PtSlTddC/nWYqEBD4jZbLAxEJ2k1RKY+lWE+g1V7tckDYbC6AdxeV\nINjTcIN+TjYe6iljKuEhgAwNpDUQq9/cWg2KOq7iRKuVnbsXKQfoWBcisV9u\necAkAeoVF4shYyUVbfQ+qfjQqktlzQEzDbjmFYKZ26VhJ1mbrMbxTJSpyWm2\nBTHddz+nJhg+s9fODdDDQaw+AGcVk/mHBgrBFSglS7huZ1RM2gdj08vw5gpN\nsfibfaKqmySx+Xxl55VU/TJpehwb69wAzm2+QlTDaKpXkHZiTvGU+EMoq9uK\nBitSSAtAxqL1q6JF7t0Jceg6VmRlzpmakeaSRFddVY/jxOT3H/tWqgwMSv8z\nuya2U1yU0cQDYq60sQDA/7usO1TvE+ArnFPKRxBun7NoRhtD+jEZtOz+ZbBg\ndE76M9YdFwn9E9q0Y06jpMnFP2V9/DEKM2Qvo7/7RCst++ysT5RjgI4djEjp\nLYQGkIg28Oq4ykeBAyv4UFKVw8Uoklk8iUJBK/eDV+6CKuxxx/bTVPoG/qkT\npEhgFi1HBl7KR/AdV4eP94/NVhhu1gJUCMBgYe7eV7i6godUsor0LvtkffI+\nHeSf\r\n=g0Ob\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG3ATgX11eIDRHlob7g56EUmzrtEn6WTPE7kP6aSD2gKAiBDzt+Mhno7t7BHqL6vq/JlwU+VOGdZhY3Zx1uNd7Mtvw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813002555_1565656299087_0.058644886373286687"},"_hasShrinkwrap":false},"0.1.29-master.20190813002934":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813002934","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1ff847c35a14b697f635cdee964ac4ee565a6255","_id":"@atomist/org-visualizer@0.1.29-master.20190813002934","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-vLYL7Yxa8Ny7IbOjgmOQerJNp79/gA0upWBmkqNTR2pwZc+DA7k3caf480jkYJ1+le06C7U+RMypCpy5LGx31A==","shasum":"9368995ec6c4c7a8b4f0cf63a482d383e3ad6568","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813002934.tgz","fileCount":385,"unpackedSize":4351955,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUgYDCRA9TVsSAnZWagAAyw4QAIi/Fq5Fl8FX66LYiiq/\nrBlizsQOZWIPBennPkYHOTx9hWWmGyqhdWoaZkd1cciUPJYRcF/vPGm+BCsb\nyHPNPO/ccDAjVCE+RO1OzM99zZnwkflholKkv+iO8iThouOYeFMYsAynAwua\nWjHCP4OuuwNEEf6SWhLwBTX9M676Fr8FDjlyNvz8hLZsd+1yVqjGDrwpwJyv\nO+Z2rK6YkLosEeCzr9Q+zJYdNMJuoOEKMW/HHVn7HPCg6ykg6oDh0Vsn7wqU\nQ3eY3bQi+rdW9ZKC6wYV1flN0DPqjjSYmzpDQNgxjOA3JPip3wlAtF7YR54R\nhlAtU/m2B0UNyzCcZ6a7zRMNSkn2plE79CaM8IxtGlxhnuyHJTnkXv8D32QR\n6CblvpjLJLz3q1tnq7byz18I/oarXm8rXUgSAvnv8Z0aBijjLKzi8PFU8+id\n1HhNdc5A67cR1Ufex+27u+jSbfHrgoi6NRqgb16AKs9H7oXPoBVDjLhgNnrq\n/9mlw2aGzUkWSp5GtpJzAzlbD47xjOn8/KK6MhsjPR0pYoBfPLlKoCjcIjMx\nLTMMavGdzE2Ll/1rfMm2auVZU4ERWzbK+8ppXSDHCp1y3lewjiiaSvUPIuTZ\n+i8rTc6an/3jrXMoZslhsMhXUElZ/FDn32i6rTBFPR7LnnBrUm/BGCTYqXoz\nA+SP\r\n=cCaP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSpnMOH2c6bx5ZjyRnXPVF9F13jrnMh6J5maO7kkmXdgIhAL5MzAIMbIuLf8bFAxphQU/+XG+bTv309Jyia9cV/bBN"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813002934_1565656578897_0.9265375862290677"},"_hasShrinkwrap":false},"0.1.29-master.20190813004327":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813004327","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"246c8df67faefb3f9ef7ddb792321e7e9847795d","_id":"@atomist/org-visualizer@0.1.29-master.20190813004327","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-XqGaDQBiyenNEg2TlOUFGVgv/0i72zLfaFdndLpsaxXfBn68VelhiV7CErenCdKeh5iJfsmkL76rHAmSNSAaLQ==","shasum":"162eaeebb8dc4907ca939d42728c2e0967ce930a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813004327.tgz","fileCount":388,"unpackedSize":4357835,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUgkGCRA9TVsSAnZWagAAcu4P+QBf9UfQ67qVdbAZx94p\n4xFeDR2Hv+G852+i9FM+xliedS2C5JxCeIKpW4oZT/4JuRPEwI5z0TWMk5th\ndrmmr0TEK9IaacbsuBb+MdXCvZOr4ZtPNGF8sRT4f+Hk2X4pIg5U8B976oZc\nOKh9fdeRloiWfqhRJtYN0X0ud9OiNhWzHj0ga0HqfgIqn8U57jP98LKF9mrN\nvUK6q11OiueKff8i4h252Yn7aKSO70mCXcWlPBcWDw8qJ5gMfl87U4wksdo3\na/QS1FFgtqi+zIJzEAD+RdrrV7rHNpzCSkrVBEvsB6Gb2R+skFS1sqVZr1u/\nj1lTaU7/4WRhp13K9kGx+ulBU54/ZVqAhaNYd7W6GKeKVvCp1o4n7f+axGwC\niA69Ktun2a+rqNlD/b/ARCU5nsHcOsjYhUuLoKH+jhq4+mNqeN/vCvHd3Nna\nr827bpgFBrq818HXqa2/GdY0h+OtNbpF8Pqwaqm8EPdjQNbBwmKovlzcUjnz\n1AxrsXTkcKDeySWQxRjy3v5yLv5uemFPguWmwYeggjnsMJG2uwhnXEQ/lYZ4\nOzd4nphal24XqoYATrDRHqxKUPc2PT9jIsqnhSPS2p/PGHJe2S0tN5EnMSxT\nT5RTNVUJ1J7Lk/VcPzF0d0aomwCsMddtRTsta3YH1Cf9BFXwyd7FQ0zyqWuG\nHz3C\r\n=GA0n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCCPd9nbdV3rU6xJ+pZBGKPfbj7uhaz4q3h4+hQU0fJsAIhAP7ujPWbPfwgPJhXT8MQhph8UDVOR2F3VTQBUAKwDZQn"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813004327_1565657349345_0.525271922863211"},"_hasShrinkwrap":false},"0.1.29-master.20190813031948":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813031948","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"512ca7596c85a5815f4c66e1ba07a779053e291a","_id":"@atomist/org-visualizer@0.1.29-master.20190813031948","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-eH93SSeL3Fk/HUSXATTwSsbVhZ5Kzmx8SccFjrsGXnUnLIGrDL+IfemMgOGwKxOnC1qcTuHGu70IYMJgHcj2DQ==","shasum":"1b7acb5bb919f2449ce192cc241db98850bad295","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813031948.tgz","fileCount":384,"unpackedSize":4350725,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUi2gCRA9TVsSAnZWagAAvrcQAI6U1ISeAmtbxkUNXicC\nlmjzSV6C2kb/nnZ1EiMBPGfiImcI+pPCkmaw2LA2B1iiaUMEBVrS5GdB2ub4\nK9k6osU7JsHY6ATlA6+w5K8f4vt96q8DxZvk8SIBGyz+TRf6/9LO/CYtkWBp\nCB/L2Q5Qe0aj59Ov0kiLdYs9PByk3gbYDtguJG+F53eXbyrcnjx+77vgTGks\ncP72PDQoSw2sC2Rt+h2QU/3FYLM65sXa/RzhPUPESRx/DARx0zf/RpSjKS7A\nwpvWyq18UrQaV9CCmV3LcovuUrfssVkwHEbS7ykbly0LP5L+8lHICosRSBNp\nZ89Z6PMktvU90CEAy2/7Kfhg3Y3unydCNHzlEWh5Mk3SxLv0o0kXzq16ZmRV\nQNKL0h0DsguNoRq83+CW351eaPxNRytrs2YUaROGuWMVVtmJL/cJHdJ8dgHQ\nhrJ1lftmv2D42qN4rtJ7Mx7XuvM2Shzx9ZTwskim+AYGGyialeTO8nQv7e+B\napl+SxC5hPSYuUCx8HDAZFmg9+47xbLPYVGCPk42zPzfUYSFTkNH8KACVb8f\n9E0URU+5mmm3Dn0SIQjjCD8fHaXAn4OcP+TL5jNNeeSH/3UoSkVXnl2uqFaP\nwGrNa9SK6exxJ8R8EFfAMggAP+Ldhb0+y9mZqOjmYkOiJKEXvhNo9b/WlGLC\ne9EH\r\n=F1TK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIADM2mGfIecgESEYKB58eeu8osKCUucBTClLZdMBpAkPAiEAm7uVOmEau3W0XGTij+l8KG8erG2G1m9eiTDlxMlxxw4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813031948_1565666719593_0.8859527785217829"},"_hasShrinkwrap":false},"0.1.29-master.20190813063231":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813063231","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"038bfa8d2ed8bc591c7024373d92040b46e2a225","_id":"@atomist/org-visualizer@0.1.29-master.20190813063231","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-GsgC0Ras3mAx7OAnS7SAipfgvbe4JQGvTCXGWrH2DdbQgxh41kD09ZYYVFsJrvT+rgrqD3Vg4LoXRCJNm8D5Hw==","shasum":"15990543e06fd78df40049de762ad1b955f6173a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813063231.tgz","fileCount":388,"unpackedSize":4355094,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUlrVCRA9TVsSAnZWagAAHSEP/iOzrK4bTrEPas+VMmbB\noUs6rMT6+8g++fQEwmf+jMoGxD5MQOULhkiKQpoJBJIT08aqeUHz7XpfUAp9\nF6P8OX8OJwnx8gDQ8th9ANBKTA3DlBfaEr8XMb01mQq/rlomS2PwW/2J1Swc\nHvGUnFEfcbcvfRvEpCazPzeqsv0YlgBSXM+jyk8mHsYnRPanDoe8K9t2hi4a\nMwLk3ug8/xw61ypWSZRMKXVFW9uHs3/HKK41FOZoRihTylZD5/14im5wmpve\nOu1HPpkn7N/fipWhUW9cRl85jnoOuLUoErwSrh4u7eZjOO49vPz+Fuo+WZcd\npDF3823wqbYNP0bZXOgq0SoF8F1M3o2op1/dg4jAOFTEc+1gtkzo0G1UmyQ/\nw2dScZlbIALdS9jUt4UzBIRQFLlEajj7PPCNIJ/xX33IFuwTIUnROzCkoDnp\nGQ8h7TS2xbyn7RMBl7wt7KiNk4OANuYSVUBNN21IuLQOi9cPiR+Jv4j+mVIW\n7Hj5mviFP0gV0qmOoAHwkSAUAlW2z0ewaFERyLAY3gb9lrumJ5KH6sVdLxBD\nwCzwLZaxAPw0miFJpf4iMZDfhp1Y+2bGHkO/TdPVKyVGkftuIY+rObtJNeum\nGE3ea/v9izqSiUqfkTmjucz59AHJSsNkE4uYCeVHBLZ2NOcOzUqZfPKCjxeJ\n9nUW\r\n=ZJR2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDs2GVdXg4r5XprnThBHRKGL0/HA0hTv7725yYL+D/4QIgIO0JEE34vd6CJg1m3keqjDUoeyF7jusQ+HUO+uQvBu0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813063231_1565678292691_0.3250027826811648"},"_hasShrinkwrap":false},"0.1.29-master.20190813064749":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813064749","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"dab83ed27bff18954479d0c82baad854debe3ceb","_id":"@atomist/org-visualizer@0.1.29-master.20190813064749","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ZEKg5kmp6yfn63vxVeDun/CNIvp9xF0WQARaO6M8MacdTBhFHIRGt91kt+g7zH8lmazHo+ymulu717GgMMQVng==","shasum":"ad4dc5efa5294ca994b089f1d96820384b572e6b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813064749.tgz","fileCount":388,"unpackedSize":4356338,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUl4NCRA9TVsSAnZWagAA5NEP/jFs5QCCsVwvHnXYTJHS\nbYsAi1SLx6tmm36xOXt7o3FOppplnsHcqXF9Rtjc+/BKGzXnhckTomeAoDOl\nt2EhtB0ShgQkixJAa/mJlL7X9aYDmiVcVYDlkPK2fuj/jrpIwC00gKnLKwgP\n+bcUw/lRbqG+GosFqZpX8uB0FkMx5TKYN8A4akvFxvLLxDER/THxGiBmbwoM\nv8dOw8/SFspUUGgMYlvNQUqETy0Zu8RR0marWXpVZrW21SPophLfOondwtS3\nUcPm1AGOV7NyFBoZP+1lpz+FsnnMFp5K9K+HD2mkeqlDmX0Md6rd3j4VUw0N\npvpDvRdLrMMiP3jJDTQocD45ggCwmdc6CDhrgk49K7iL/G+9Q7ATd6kFfGFP\n9DAeX9KvHXa3eqVSgjia5DHvO97hpf+qho+/8zLQHYWqyuguP61toN4f5DBe\nkI0nh6KOXSsG7aFaUSGo2aYG/yjks7/1Mjq1I5EAuL4icRzk+/+tLKUYviXz\nBJfSFoun1YVTDNtigb6b+tiyqFWI9bBxAp4dgXOq4uJogOXIHWyCa4yq6vSG\ndpb367kpy6BxGWwc6ajS9XKPli11u6FarH6O8PpKFrc9UOmP7zT/cPMXUdyR\nVGJQ68z0zujoGQqTnTq/Sh1NtULkYCAJXkjHJbbFEtcPXP8IlsEjgTFgSTkN\n6TRU\r\n=djCP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGhNq5P3rzx6TkR5T65MzaBJEJFKE+exi5rY4HqzeNOhAiBxQKwVJ3NS9omExGjFyIJzh5hLiYAY4O1WTNXH8nZLxg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813064749_1565679116912_0.07449441421489178"},"_hasShrinkwrap":false},"0.1.29-master.20190813070002":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813070002","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9c79264cb2751071a92be307553f7ee9b4bf64c5","_id":"@atomist/org-visualizer@0.1.29-master.20190813070002","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-FB4ozck9Y/Ox4tKtC8jNpDtxqaS/MeVmRWJ6S6mhl9tQow47HSb8pEySXZpqF3f4uF/ACKkEFYplCycWYJPLbQ==","shasum":"756878b1a0d7ed25179ca5957d4cb8feeed0ee6b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813070002.tgz","fileCount":388,"unpackedSize":4357647,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUmDyCRA9TVsSAnZWagAAYe4P/0TAR+DrHxxEnxemUpQ9\nhE5GLMOK4c3XTrWlmXCorkGDy7cQTe4vcfKcRZR3Be3efnZ6UjjIstmPPc1S\nyBbNO03I7506MxDsAmr8MeA8h9lc0JE5tQQtZZj3NjHs+LYpKJX2WT3/AMC/\ncSe2nV4MOAaDXiaML++bbw+LjQaDo3gGcoFHTDYM+yLF3FRSt1RSG44VgE3a\n1L43m7vxF6ie0lL4JbUGWXSTjMWAKbIYORrsMzCfkvmQgXJ2W1e0EzWbaPgB\n7EPXHgmjwXekvRjXLc/OMR/uzxMcEXbwfQL33LU/vcpFPZEIRerurIY/R1Ge\nJLzEoCPyxYHQvX6hdyNVLPxw2K1NeYiFMwpGSL2M+UIgajMXMuXNU5nRHm2J\nY4Eg/0C07n9bd++Vq65rcpiMWTQiyRETRWTso/VlHoi8rHUf05H5aXUZlgo/\nFoPP7Ixp16jmxBeyI9G0pi+3/hpGZlf+4nGFzPSR1NTwbASw8wQTwf72tQp4\n/xmPjK+WwfA8AILgT2LZxQi0kEVSQF1+MjALryNH6gFVbHciWs3ec+KQS3g4\nOiNjAVZQRf9Iujnq9Cjt/K25yTF/HwRvFLIs/udKKJ1XSnmic3yXbZw7Wd9W\nAje4uVk6vERgwvzhHrQ/4Fl/kRwYLw9Tdom741Wp5+q6exg8GLrZypl06uCl\nYPZF\r\n=nCqx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDa6DEXncjM5w6NWfPiWnmFiJyv18do5vXhlooEO9Nf6gIhAJp18pj2aP2hE9KMMQeZM/RWwuLcqxmNWZ6wKYzMONJw"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813070002_1565679858351_0.14388391490517427"},"_hasShrinkwrap":false},"0.1.29-master.20190813080112":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813080112","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4744a69f9057703a548253a404e2aa8a50ef98e2","_id":"@atomist/org-visualizer@0.1.29-master.20190813080112","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-/7iQzroZgIcZRNaAgUZEdCHfSm33aoCwhaK82BawAbFizJekbp1mdeIYpBItwnjVWH1ZUW6v42HckkuS0w2Neg==","shasum":"341c56fd50ed30bf30e62e58f391c2b7587bb883","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813080112.tgz","fileCount":384,"unpackedSize":4355108,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUm+jCRA9TVsSAnZWagAAd40P/iueep/T0H/NnFcB5k4r\ncVO/tz/PJGmFK4z2LFcR4tU2uaWODK5XtEZ6N6EgzhMgj3S0ETKXIwxH6/zS\ndbXyz+8XCxqpEzIZZhCMpa25d97lICvezwhBtM4UX3UNB2POhhl8n6tpW8ip\nmTi96pStD8Um28RKlWEFXVOzV2BoKxS8vfLCEcUgC/GK8f70k8P942/ApZsR\n2hAYUJNjvWSyo5z3Nn6peU4Q6efaPADBAwqytEl0Z3s5Uy2epSlQjDuNd4ss\nEjAaykW01DrIYEFe64iKV4xC6m+e6uRrk0i5hmZlBxUaoIBqbJiZJ4j8eGDe\nL+E6jXd6KDF8+iYFSB/ogfl4Lr9gTai6dYy6JsM1zq4dSuzJr0aVbWkD/xgM\nbvzAjANE0BSPPrX920OWrL0Cc8ZR8D52IBKmYDh8kI4+dUR+MWkms4GGxDe1\n/oj7w9f6mdFG2NLgMRtnp6ZrMN3yWhBCSez7bTQmCpDs3iY012ueeNbrwgQB\nkKtI+27gN94gwefGDvmaZsMBWwnRmfDY4jgXNr+PQI7NG8iSY01N4xe7HRIY\nZaBlIhZr8cxH1aM32yvrLBscOW4OSGOEZSwa0e1Npkorx8xnLh/zN/PV2KwO\nbcgiVDjsPwPLGH1v8EfEt3P7dXEpU/LVH0maOxTzFt7gXq4POIEHhnh6+h4I\nq5Bu\r\n=QnUj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC1aEIlBLyEz2bpfAbtCahtFhkb3IHA7NcDBSwhzBu6ZAiEAokUSSlLFXyKIvrRUxWuVopROCPBSS9SypoBGt8+JPwA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813080112_1565683618856_0.9660731039069514"},"_hasShrinkwrap":false},"0.1.29-master.20190813080856":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813080856","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4899f20c16c31285155ef6e33c99420c7484682f","_id":"@atomist/org-visualizer@0.1.29-master.20190813080856","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-rD4vQ2KntXKCttb2ri5mgm5Pozy76SR/ZcjNzNISh1TFIX/j0Msd5WzNWvOPFI2d/cYJdPxeyKqEBxKMppjXrQ==","shasum":"aa0989014096e256a32f3d6cfc8b1ef6888e4699","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813080856.tgz","fileCount":384,"unpackedSize":4355128,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUnHQCRA9TVsSAnZWagAALSgP/0TrscVUhuK8PqoeugXU\ni9ufup0zxZ+1AGjm5e5Y12/QQ6eDS4o5QKBtjZKn0DSyKW95LJBqpjkAbaB5\n9uvOxCKH0DYAAbyAHvYX+kWO7u+e22JX3CWmf82FZmhLLsFrZFqyQ1+cPcOc\nYsE1Ue/BLJxdL/J9d6jR/IQbUNpMkh10ZXHF73OR8X0JKE/A0crnoVID3tmi\n8vr8MwBK3csBpHVb2us/8/F8jBjb/1TjQdft7avuvH2GPxhW1cAG5Ms2L7FH\nuO7aDLwnPzgT3wwXGIAP3zDSWjus84kD0nhW6VuPqQ31lp0audX5UZG4XlGR\n9nVZVMFHUsaGX8SDzVm6n8LWtxr6rfBVynN8YysA3xcvE9ORrREAD/796zk3\nyk7jvtvUKi+tyfNAOcFEbGKOjzjxJ6/CkRIsADM4wvf33QclMxS1IluUUwR1\nCnPzbPB6M3xP+ipfZWfLgp88s3Oo4PzRmSJc75fh4nMonh3fkI30YcdAvEGO\nFdw8kqt58lC+sOgYUI1fPgoN7BHbqZIF+drvUtw99w4vltWz0aCSkvFn9MFE\nO1TM+qAoFzgXi0ZfI8wkGK6Hruhi0k8jisyuDZYh61wzY+WsAUQtXvRzyjuz\nNNOnfep7lXm3ggniMQhte9M08EgotcDCsoE1ww5RauLIfN7Dt7xAlVpCqFk8\nktvQ\r\n=5z7v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAJ0fHw+coL8oTUOfyRv5d0l+hMVnve9LeV6S8FME1h9AiEAiCQxrZWdTI7FcUKglv1Ye696ufAGDf/krKIFnnF2ueg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813080856_1565684175923_0.7769690913094991"},"_hasShrinkwrap":false},"0.1.29-master.20190813081619":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813081619","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3c257a813e862ae7a07b9ddfb36a5bd6dee474d4","_id":"@atomist/org-visualizer@0.1.29-master.20190813081619","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-PgcRyuFUFcsBCn3E5fm2/ddWNRVQCSOfmV84ZKxoiTfyvCzP/zBKQx5hKJpkQYonXlFu2qLUdXDd4fTKU2FP5Q==","shasum":"d858a728bc64e69ff1197df4001b7e21d0e3bd5a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813081619.tgz","fileCount":384,"unpackedSize":4355061,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUnOKCRA9TVsSAnZWagAAUSwP/3VIEgfQUtt18t4m3rAV\nVsL0eKazUS1rVcfbJApAm3+2OUv36j+wYFz3c8SSqJSnSm25ltrEZOiziMTv\n9FzZWVn0qSWYhi8zxYvazLraqrpc/SnWUKqpBmYc4czy3OJ2Y0LSFypZ1aU7\n6yQ8PNGy+P3DM0tUs5ePuIVUiv9DBZ4Gz64K2kb04tQ7cGejoOn9dq/U4yb4\n/mCEIZ3KGtOa1vtS+aWXEjvSgT46ubPV2VLutx29R9illucwsuFryaXu2oWt\n8IyQRn5xxJuTufoLWMmCA2hpXWDLyBO9LuA0XoO6hb5PugMjCPIzrOU6MREQ\nW2ub3DLEpBz5f7TDYijatRadWvQygW3BhLeqoYnCcgZbj2YZUe4ahw2uaKhy\nnbC7nbJ/uX4hey9N2afcAla3WTvDSMI1PSUCfhcoUnzC8uyfuob9fI0K2tiQ\nrvz3HVo24+Tn/euyrl7Wxl9FduY1U1BvWJtf1F0lWPkl01nOGWTeSau1Ff34\ngrHXDCEKudfQQNhh0hvh+fwTMZQaQgXGFr7FiFpSjQCE8y66ZADkUn3Zw9ZP\noQwXVDa4pZ63G+F+LeuO9QpHfeYnOA3FimuB8VqtZKgMWI01bxCL2EnNtiwu\nisoGn3LwAlPh8miaLEc4J80Qa1iXjTsgDaLwsn2N+LaBb6xrhKWmTsDz+FDn\nYPMu\r\n=v/sc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDeCbwQ/JadL4QI5EMAjUgGf3kHNPqnAQ9VUuPtQb71CwIgTESMxPUl9VDGhK8hk4B2WYgpPs3T0fPhRirZ6HBSlBA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813081619_1565684617757_0.05930105602836644"},"_hasShrinkwrap":false},"0.1.29-master.20190813112436":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813112436","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"70dd5026208bf718dfbbab276b9952718d91f5c2","_id":"@atomist/org-visualizer@0.1.29-master.20190813112436","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-mLQYsNcAeg/gjuTEss/I/nwP+nty9YvpYY3ee2WVsVvyfm9xyGZY0ylDP7VJPS7VTJ8Df5mMF2VoWzxWGR4XBg==","shasum":"8bd6887ba942133fb7e3ea1e937ee43a060873cc","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813112436.tgz","fileCount":392,"unpackedSize":4363168,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUp7eCRA9TVsSAnZWagAAhooP/3ppFc3CJHBkj+p80ygw\ndFb7R30br1pSX0wcbJWpFVMQFnz4q7hBslCkmkAXLq2mMDRSLQslxlGkTXha\nbNofHP+G8EQdbapqPVW9pWvL//wftrxeiSR0lcN4MPuee3L4C0Uxkw8wmrLE\nboQkp8BWiqUVLBM+doeYvqhuCIot/5tp4Ph4HWlL3gEL/deQRtM6H+YUIs8H\nmRI3waxlWelG8ZWj/t1XS2hQDlBL6pRA2f4ebXOfoGAaQEg0DvODZ5j28CCt\ns0Bpo8jgEF6B25kKuT5mX/jR+SN42EsJY7Y8OoVOix9re0cPBnlw49/CARwM\n7WYKDINH9O6zGzVMYI5KEKsN18mwX2KTl3LAGV+/Tew6xYA6pnIELjm8KrS9\nwdY+jlUH+GF+b3mdTRUacpWSKCFsLTGLDWntEo56HKgzlqhecbWI1fcbGbOF\nzHp+8LTwp5Dfg+cOXH4fp4ynHej8kJyPoUS76A9dcYARdDLdZYndL0TRIs2G\nN/YLIibTzGZQfkMiFkfgDVUS+LOVaZjBSw8i/TUHBmi76u4/F9Daq5DXAGTD\nrZJdZHX0fda9RmikBqRd44q6OVuYseHx+Vp1DPL2hhDanpMPFtlLwR/IaHXH\nb/xf2hQ2L7J20DaLomu4N2kt13/88NOVmIQQZoKdsv9Y3ZBSTizhpHzfx1k0\ncz+N\r\n=weLN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCqKVaaSO+SncDHkAhLIxBdTi0SDeOW3T7T5rMVbwaBTwIgN3CoQyuWPskdKLYyag17CcagPfQMUgHLpEqa7q9kNDs="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813112436_1565695709669_0.06918595456659826"},"_hasShrinkwrap":false},"0.1.29-master.20190813115206":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813115206","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"942d8bc88f99cccc9251c74e1d981f1aaf8e4a3a","_id":"@atomist/org-visualizer@0.1.29-master.20190813115206","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-O1eVnACX1hPplfkphLH5GRxy/IT61BU6a3XFb0YiG6HmrxVPUaljZStWiPsJjhgUg9rF2X3m7LTvD/5R6a+mRQ==","shasum":"b25ab5901524887c24607744b8e1d16ca8bfb0f0","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813115206.tgz","fileCount":392,"unpackedSize":4365113,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUqYfCRA9TVsSAnZWagAAGhMP/34Yd9boCdYznvt6T4w5\nd+AxmaVmbLTdGxLf42P3PmaWmZP+YdMcqKefNNRiYJp9xDNZRTEoU+RYsu6Q\n4u65Qky3vOILrS6Byw/cwBn9tFt+folWULrnbEadLmWb/CCKGr36stRIxY4c\nQT6dNvKDdCtC4M6rIqE++kttGK6UAhBsVBDdjefiWaRFRBiIJ+h6xswl7vHt\n5Xy10BGElgVA6HPfHZyMv//ynXEFNFj8a+jnVzgUZqEhOtqD+zpdHVGWtylV\nxV+AOyvA11d7sQJyG9aAn883Zv17y91ftYIpV411OcHJ/3vPsH95HxcI05hM\nfucHYbmYe3tHS8zlbR2JMqhTAQD7UUhFzx/e2Ar7sEFhg4ZThQwHVq7JEMAA\nGnjMWChQZPIDSghof34itqg3W9ZofRYPkVLgdlaGJtLN2vw9muhcy/jbGRpf\nnfWvjpbixlLQb+4rAYp5VyMiZmVOaPqIVIL3VVujCfZgkMuieMZvxR4j6xUv\nYydFDo6UpZ/pQ9QrgpJWSsIGSxFJz4cJ7SbmkknSf1kb83REH5iyyeqDvCCi\nfZmPb5s9JRVnVZL6GZHmjwT9z0A7iBwO65TRc8+cT0Qq0W4Wuh9mEm0z/JJV\n+4ty4isTlESmz2xvqNzzOP+QfFoA4Nsb9yJWNQOW6ithDm0YqMvQvLSmKX9f\nhpMA\r\n=8x0o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUqWe+4MuXCXLOFlFz2lffz4Yh3lHJTCU1T4sdFGAy0gIhANLqmlwiPWvZkJOIsfaWS3EyVvqCiGVZvTCukqiQ/gQZ"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813115206_1565697566738_0.3073161886047344"},"_hasShrinkwrap":false},"0.1.29-k8s-spec.20190813172855":{"name":"@atomist/org-visualizer","version":"0.1.29-k8s-spec.20190813172855","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0c94e7075ffb225ada8f777e31ef7f96ab6ce10c","_id":"@atomist/org-visualizer@0.1.29-k8s-spec.20190813172855","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-k4lhXpGbdvlKAKPFhAyZfYQvSzWnxnuQXaUwAJgRPedyznkGomB1tCtF/eBvGnv8OXn6NQM9iW7R8OsY7Gwejw==","shasum":"545c0b68f13cb30e43f16b7b37767460890132b3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-k8s-spec.20190813172855.tgz","fileCount":396,"unpackedSize":4378780,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUvUeCRA9TVsSAnZWagAAQSkP/2z2NMuaF3opUv+dhYcC\nQj07DS5Jmqf2Cksa6R0exga8VH5Vomim1yi9ceJ8GzniBpQ0BkcDknT0mRFf\no4byLCMZfba9dqiOvnsjpXaKZKE+qZm/tk0yugA8embmyNpfP/IAbxKcbdpi\n5AQG9rEnxlOQMBhn3lB21qx7dOOokRxssuk0w6JxNlugvsVG+oWgLxfQyS6Q\ns33sv6GyeVODQBuLFw0Phe/DXmyoVmyLfn/OcVRp/HFfVfiFWtS4AoyOYB5B\n5xh60wKawt2rVaDynlQJplzOPO0yoE17bQ4qJjc36ZNjcl5yF62LcFEsELC+\ngtiwR07TrZn4AVwxZQUS7h9cEBYXxTTZrTzoLuymFNPREr6T2bbqYnDMFt2a\npiWr5HCdlaskOm2211GVW6cAGAvE+fEKEKEvw0bH8TpI2O5l1XSKnjDw0iV+\nYRVkRAV7wr97+28TPWHaWPJvH3SDYWNw2sioMWPJ0vAk91chM1pH1hMpOlhj\n/flmjgvBjqsQFx1+eNHnnNdl+glEXTzzZWSgf+qXqtri/3pT3sUss6MqINBb\nE48L8TpPaIk3WuqcTvO4nbhadUXeYmZPLU2LDraynDopMmle7jK3ZvQqwG2l\nrUkDpIfRi0J80gqzekUxjdj5uIYQYWh935HcNJgCMqsPT02pxYOPVtG2h/cu\nkTUl\r\n=SPvI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPnd4spY2KRrF6zev1HOm1DzlAVo8EcANhV6CPMcAIEQIhAMYAnupoXBkmMYjxzwDLndikxL66cQJhkDNRiPSrLcpW"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-k8s-spec.20190813172855_1565717789588_0.34361559469447434"},"_hasShrinkwrap":false},"0.1.29-master.20190813175211":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813175211","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"053f4f6ec9e9eb03c6b61697aafc4966442c7c31","_id":"@atomist/org-visualizer@0.1.29-master.20190813175211","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-/IgGyACKcgp3gIKOiw0V9/QbgV73TCddONZLuABfCKEqHCgk1LkSEnwbHI7CvAAkNDAaNmKHIqc/1yrd2xq6pg==","shasum":"e0ec4b4c406beb61f1d4f749a6a7aa6c2297dbd0","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813175211.tgz","fileCount":396,"unpackedSize":4379334,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUvpjCRA9TVsSAnZWagAAViMQAIThwtYOKh3T/mfJVB/M\ni5nX/i7JXYfulUQP+vq+L1nrOizQqi7sqTi5KfwOI+Pu7ui1di8CloyvsTIS\nk9Zy5xXym5H2ifjX4ExA1W982CQKG6mwlC4vykLsc6/EPbMI5EX6js+MvrmK\nwA8qmA/5/Hs3+QDknzTPAXZmUWo3pGYIXDqK6XRr8fRqv9XBvF39qKsU6tfs\n8BBKEFTIhLN4XsdVtGRka5MqrU8B8FSqfbg33Z8CfGm0cH6+czOHRFtvRDbB\ng6ZVboG6BvkYXhBgfvbT96Sr/XmAIQldAH/Z9shkEzTXoFiH8EA0AuuY8nO5\nBDEP8kNqok++GA2ZwJL2Sdo6H9U+wCb+inoEjnbhazZaOjJ0o5sNvx5BT101\n0TOvavloV1udPtWaBl+izND3dg6lTaYazSDjWwJStV1NWhEnr2a566HkGq3X\n5zeaIcAPcpGxMmmCMGSMwC46Chx8pFQi9CGO6eYRt72ZCkJJSLZPkYMbbPQ1\n3v2wUf4GiX3wrxx58Pij4NqDjWy/MCgfBdL7Kz0DXcYGX1dl/XVdhCITb2xa\n47zz0IrtFKRXWKP7mC5nXYyU2D1F11x6bOEx1yBB1YnvXOEOF8p481KOOXeR\nCleBsIcfIfa1XbCxbrVilzBQftvN6jAJBg1UgVX90IomJpugsz0RdEq0mSE9\nfSVB\r\n=R7Vk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE7ReW0naW/Qqt91ilyF8s19wqKy/zQ5st6eLAYgycRZAiB0KaUtB6mxSf10vwsHYslbT4QiPsvmgA4KKepkJiERKQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813175211_1565719138531_0.2350804729205873"},"_hasShrinkwrap":false},"0.1.29-nortissej.log-at-debug.20190813205405":{"name":"@atomist/org-visualizer","version":"0.1.29-nortissej.log-at-debug.20190813205405","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8c9b2a2e016ab86ef235a364c3d1c0543be12f37","_id":"@atomist/org-visualizer@0.1.29-nortissej.log-at-debug.20190813205405","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-uh5S5jrv0dQ0z+Ajj/b0fcUt5L5Eab4YKZ58uKrFLFRLmTpTNlx3zYg58s7xofCy1vLx//Vp8LBd0cZ8mXVSOg==","shasum":"effaa5d7d4e989b114718fc8359f9187225a5779","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-nortissej.log-at-debug.20190813205405.tgz","fileCount":392,"unpackedSize":4365168,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUyWNCRA9TVsSAnZWagAAq4cQAJm2sUsrxwvQoVMbw4Rh\ngcBcs1zaCL8rU4UwEc8IjhfOlDVHMCrii799RH6hHZ1iONDFzSlB5rT3Bf2N\nbbSPSlN40jKTjB7c+3TbhVkSFgPl/RAd6WHHAUwhSX28ZccndnxNVfSd3b1Z\n8y/iGsYEcypm5VH18g/EHvLMqEeWZe6u0crWXKHZ7R7CmS2kdHBstY+3nvYd\nqv3UCHcq2yh2ail3EtvOeW2vDBzvjAGPSLge1pj1DWBkW8RgRzxNTn3AP/p3\nyJaAofIj6PB2YNsrp1E8csJHH4Fw6hjVlyseJTu4YvqfS5/rQPTTek4kSud/\nveSIZZs0ZmQsTL6dV1aq1dXK3l2ADjgN1KlddFtALiMgeCQy0DXsE8aaXHbP\nD+kZUVMeSbggyLtfy3+QmJsJ6IQITEkHBnOiIT5mfIrqY+Mf9+WaCDYXaq4w\nVP7feXlLIhoN/VmoNfwjJitIvAopmXp/Wx0E1ERV9AMZV3rmqeoCKejQFAZ4\nKR6kABGsfuXMzpPC+M8oFa1lkXm/peNUa2HY/cM1oh3r8ewGUlp6dnIk99WF\nen1Ttp2JRze9DoF/JIQfbVaMh39Hst3z0uvLiF04yDuElBp4Yro8t9ZVR+Gq\n3UMl89GjKj3W0P0cKkxZGc34EI6gJrk0Y8XLDuGcjyewowzzEvjcF9Sda/Xd\nQO5g\r\n=8Opt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3tfwxJw92rvzf4VLKBmd7bV1ND3rw1Jh3IKw6XLZnwAIgD98eKfcN7jl2sTCHFoJsZOodSTLcO2SViyR7JWKLYD8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-nortissej.log-at-debug.20190813205405_1565730188232_0.1268310986095178"},"_hasShrinkwrap":false},"0.1.29-master.20190813225637":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190813225637","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f0ebefcc862be8dc4843251d7f0c52568cab6fb2","_id":"@atomist/org-visualizer@0.1.29-master.20190813225637","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-r6SBWh0xch65M8NYv+q0ClTwjfSlDjAeaCHK5dgFqKW8KIctxtdtowzHKdTT9x9OU3BeMMpyH18Ozp4Ru0C7gQ==","shasum":"ca812d6377c9d0db8440378e492d4398734fc87b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190813225637.tgz","fileCount":396,"unpackedSize":4379357,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdU0HiCRA9TVsSAnZWagAAuYkP/3zU0+zn+JbSK1oJHa5n\n6V2FSQVRX6TpaEqWrJvM90McEtRWnaO7YQKTlYoNKJX8CsnmKRwttraE8MYw\nV9h73F1BC3+w1mjGKFANzegUTo/NkEoe0s6+YhpMfxoJrXsJDfcMwzQllSur\nqxuGO0O5ubGG7u6BhtQuGhR4iubZxoLe8R79t2sTS81fLYETTgQtFl51IIkG\nfjslReB9hEs+lBt5SGyFfWS18Ychp4cz9DWh6mjGIebqIjBgH2CvgJ4NHFo7\n5PoHN5olwE/sGIeCEE0QRmuGDKQCRFEuKA03l6/3yi08RgN5bkfWjfJrM6CR\neWXTCmD7BkFFW9/2xvYzKIzh3F6hBu2Qfg8uaHzE3t0/Eg5UYQa0qbJS/q4D\nCJZeUq00R5fDSOQ5xVAarFBTTqJeeFS+NYk7f21gDIbCoq4Q6Jzn1XLosJCp\n44IVifP91hsCDbNs+8s3vct4ltKaaWVnO0BAwh3ZPpPIH/udwhRawbhgMpau\niuQgBrZ1Xkc0uXClV+ILdpfszbAybHJy8Yc4Y1CuL69+VYO1d8l2yARZD23r\n51/UJhs4R8ktpno84IYzRO4cE+owEoa1dB891TJ+NM2vVyBMYdUQYbpZ+cc+\neL8OAmUFyTihoxVAPcutlE5JVcTWD+Nfq7KZnJ4nczC55gZ7WHiwN8yxEUXZ\nuKso\r\n=5lrr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID9LC291aGjtkTTAbKRnrfuM2T2XLBErbq5hN9r1+IewAiAew8amKnJuTYDSvTd+0fEPFsiLUgjfkdHZbqdaqpz6ag=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190813225637_1565737441479_0.6727629454581268"},"_hasShrinkwrap":false},"0.1.29-master.20190814025836":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190814025836","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ad5bea4e35aa00fde54688fe63a7d057e92cdb83","_id":"@atomist/org-visualizer@0.1.29-master.20190814025836","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-RX3ACCNdW2IpGLGwZOCUfE3/AEnwSblnVKFkU1VFMxI2O3iVIwLu8gwURAxqOOmYy+YsmuULNfq9pJOTg/iVJg==","shasum":"a4b529274929541e70551263f79d071e26abeed7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190814025836.tgz","fileCount":396,"unpackedSize":4380109,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdU3nVCRA9TVsSAnZWagAAwfgP+wfCclEtlR215ByC00is\n+tJv+RHnl5wwBUU+uu2lCPBMCEddHDL1TABSW4u9rsgEW/JYdNYmwVRlSPSI\nB3H2FjM14Ht2hi3DXX/J+RT1FIBEy8EGf52Zt+NsXHM8uu18bc49QYTbllyk\nZIyIcjEKrU1CoIKR+dKEO9J+f0jNBZ4F30pYrDkHgTR/2oODMsI8i9y2kVUK\nVPpszXoOk9WmR7jPK+ncM+YNcHhKhq6uVqYJngpKWNKwCB87QUJaZXIK/Sp+\n7wjJanZ3XPbLWFyb3L7Jm54cTk9+6yxHhJD9dY3JsEwKb3g0oiN75L503HJZ\nE7/F72VroZxy11dtuqQfk05pJgq4a1Lodlyu5eGul6Ui6AcWRC/ZGglhJJl2\nMecTBjfBmSYu/5iLsJir3Ziz2BQGn4SN0XLOhNkCQsNPEfRJpXgpMMVCZO6J\nQJDJwFk+O1rlc4Q7pbT2Xnm2XuhynvLoS+iLe5FXLWka7W2s+qn9TBomrmT3\nzhfq321Jen4nQBd3y8+dAhBv4jJ7913M2sboy8yxISs5rLnyaJchEsvt3wHu\nWKu2AgdkmIEBVTNzrBRxNpwqGyn5BzNLLb2wmbxOoIvB2tIUuVvmSZo1qEH8\n3gtxLhmWM56v2v/v0MFZKB+W7koM4aV12qevoEwDk1D9cJ7QNAD8DUtPRLK3\nKVVQ\r\n=bXyE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDtES6zZbdsfPE2HGaJFbssbA5Brf3Mu7422DbatejDiAiBpoKmpM0kIASUyhSwCDq2LL6JLGvCZ2tw0Zoxm6v7YuA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190814025836_1565751764824_0.14071061458418077"},"_hasShrinkwrap":false},"0.1.29-master.20190814215730":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190814215730","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6008285ead9d22951a8b34a0b86945c9f1318535","_id":"@atomist/org-visualizer@0.1.29-master.20190814215730","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-f3IFHJS2UsJX/EkQcZS7hX2wgApALlFWiygxs9scz0vSOBl3S0z46iaMpTNleFG3ADO6/h6mfcG+HQb6O9Ht+g==","shasum":"abe310c358f3e04490b6d1bdb482e61b4de5d4d5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190814215730.tgz","fileCount":396,"unpackedSize":4380060,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVIY2CRA9TVsSAnZWagAAcgUQAIAbVShESG6I2IofDwIF\nDrvJ9btxKXabDSEuRzFzWrZqwp2lzbCBfBxFhMl8t/CYGrqWQnipiIi3igwh\nxbLT3xiYMrGvReB3Ulob8flpw2l6/VNRD/12hqfZ6YfWUC0CUxR3AXRsPfu4\nUmOX5Hu9bdEEXdrR3u6L8k+Do+42946m21TG4EmkT3M5wU+PhwP2mfTLwF9V\nsIsgBNuJds7XzOaWzZDcn2yYqtmASBn6ut08GTWSkKR1TCSDlnuncOEstUOT\nELmihjE+uyscCiTNkpNWU2dLpGclOwOjwS6lbAaN2IgiBfDIzrNn127a3yMb\nrUuAj/uJcpe03mRtrG0c2h7iNRH3fzwqNeS6VG1dQXu1P3M0t01uKcH+3wW7\nAuF67uVA46SN1tNOFXB+BaQe2JQKXMgKlgBuv67uxEJ2iRMaGfdoRFm+SKrM\nf1oAI2dVtdnh4IJ7KW8phv05NA7Cl0DKjM5wM8yC/4jOVo+A2S6aIE35dIqQ\nlWlzKO1hFOQG7U+Tm1GklhcCxLirWadoEkZeSVwDMhS9DHLpRazxK3IqevNC\nwig68PagcYGbbB16IXL06v/++6j9bJFLvYPAvsdoPE3CW1+/wfg51HG6w6my\nKcIovZwbjxubmzxMUwpkiE5W+TNAgZFMdZxLU18/WzipESpuViFXJTSJFuXo\nHAHM\r\n=Lb3T\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHpz63mvw+ORwN1EY0YoAOm6/W3NAl8tKiY94fwDTrqzAiAHQZ8Ei4EOEqs2M0sn9/R9aJ3R0CRWIHoX8jF+vlrCEA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190814215730_1565820469771_0.4393505795947261"},"_hasShrinkwrap":false},"0.1.29-master.20190814223403":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190814223403","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d4802e5116f53c9b65d298d539b706a307e8d0a0","_id":"@atomist/org-visualizer@0.1.29-master.20190814223403","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-dte2QPTxVHDZm6lyEqetL5Qhs6IQgU8J527zrmQYSYOXXmWOif2du3awFVpSBl++wGllFPLt8hhiflzY4jhysg==","shasum":"71164c41b252f1c64f53fe13220dc8084ea8e144","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190814223403.tgz","fileCount":396,"unpackedSize":4380061,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVI4hCRA9TVsSAnZWagAAMFYP/1SEsrQQi/l99xRpLNp/\nzpA9uIMKypJccDaMSgTX4+RBU/ioGjuJkaoWFhgPPtonAFDZ2cZajk/ueUAd\nvcJD2Sa6Y/xfMFVBGTT7fU/4VPlItdoig5Yh+aBP73jiEtbH4t3f1eX7VQXn\nkZfdQp9U3o2Wcuw5/bUaoLc4X6tnnjue+p6SifYTJ8S6SOs5H4Z9Xplw/YA9\nAdf8cAei8GZwa1mNlxw4YjvHV7Q2JLF8Y/olPQ8o7QU10F1x+m4HdCCG3SS+\nWrDie58ZhBbnwIOeqUVF4z+711fHDONknuoz5QvG+8EaK48okM/0i7zm71ia\nl8vgKZjISbPzct/EqSKwzsouzJtzAOKwwkM3t+AB/ZA6CiUR31nMc1uDcbjU\nQp0XLd5PdN6+HhSiYNzxoAW5QHdjpTfBjd5LHauJm+wKPbqLY8qLLCvYQ0RV\nXa/p7hZi/OkLf0mrfLSTRvEf4nqfhP64VEHu5EmvOB4NDD1tBUXGSq08pOhk\nk82TKwn5HhKykZySkBJm9T5jSwoOE1N03E5VWaVt9B6MTeovsIaGYYo/s7TX\nB0njkNG0jM1+nIf3kDz14fgOiSe2tKLsgT2yuJoejOWLF1b+MaT7dL46oS//\nObYuYmaFSMcL/sdWnKHD+frTC0ZmSnAVPfRUCPk/WESMMkM3+b4E84I3uRe4\nvoU+\r\n=eQyK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCHGd9E6uSNw/eBr8j1P0ISr9mjbCupSSfhUOoxkIo9ngIhAP25DowIbZrehXAHYV4Xck6GLgMrfzQ9cCgzycPEuK8/"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190814223403_1565822496064_0.8291221771938457"},"_hasShrinkwrap":false},"0.1.29-master.20190815001455":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190815001455","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d7a5000596331b1ff11d7ca192528a8663e17d4c","_id":"@atomist/org-visualizer@0.1.29-master.20190815001455","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-4eWR2MoNsWTz3Alc+qXCpi1i5MhIENrB1XGVFLTZ+tYLIKZCETdKY7dB0rs9J3ao61eWKHbaDKh4tPCY3QtbkQ==","shasum":"ed7cd57f7661dced4f46a0b2aa0c54e11c5f9ae4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190815001455.tgz","fileCount":404,"unpackedSize":4383500,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVKVfCRA9TVsSAnZWagAAxFIP/0RP38M5bg3416gbkkoy\njQcmlXT6WawhWO9saRST2Sf3KemqZiBQSu0Iort+u+z/vcb+yH6PEwS8wudP\n9D+cvUKgG3o/b0MZ/EEL8+ep+FWe75x4BMSAc2vIpJbMw+y5iJZdiPVlMBFt\ncaeugoE29EjET4liOVaGXUBQyZoX5AcGSipdhOI6xiLwo2mQlQZFX74jyx9y\ndlA0lDVqj8Lkp9Q4jMvfbRaGMJ+r+D+rUKAeXHj+r8GJYimN030v6c17vFB0\ntORBXXE6ccPmKFA8t4g23KDb/aUViVEIQCx4Q+ev/iDZ6VFNrVchvcfRVBqZ\nJTUGs+xLxEN1WyUhEDjBGMiiyUL9sKi6+YpLP2z5QgCUi7vYFjfS+UCcbbCk\nKNSVTnACbzYNOK0FPi59QQ0psQYRQ4RrQyuGMfX4jpLSBZq6prOtiaVx5QPg\nfXp611J9Qfd8d335T7USiCBz5W/fP2m4kFdAiokVEn6rI0XetUfekSxruVY7\n/n56qPqScWu5T5RVlwGTFypHgd8h2SH3GFXnUcISbxWZVpS7WZiQGSLyfT5o\n7laZ/uwiOvZvg2JfuYdZmcaX074vyAusHjpusWQlxttKq2UPseh/rmMMElyE\nIihfVrXNBcOhCLoyjDs61+MXxyxotBIhPWrjpinw+rfUeGZXd83yPKKF1y8U\ncUUL\r\n=Qn+9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFHo0BaMrZyoRUZkp8wdwKCl3P01Ycz3sMtCtI1zYuiTAiAtONO/w1ZjkU6+aMaiDyEZ00Twi71z1Hjc7Jfi0Fu1Qg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190815001455_1565828447264_0.8895388720255539"},"_hasShrinkwrap":false},"0.1.29-master.20190815011616":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190815011616","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"1f909ac98b6b896d0245190ec36eddfba5dad26e","_id":"@atomist/org-visualizer@0.1.29-master.20190815011616","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-STcFFcwVYnfeSlwiJJYoSHCF+SeKPURbujbgASHZ/WtzN/A/dxwvvxb7LC/0NuWzmxEPGt97OKWOUAhFSQhwKw==","shasum":"3fa19387b8f3071b6f7db158d775b9b22edc05d7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190815011616.tgz","fileCount":404,"unpackedSize":4385549,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVLNLCRA9TVsSAnZWagAA9xwP/13vQWp4Exu9CbFkGIzf\nwzvCtH2Mc3281m2l17nun3Mu8YohPi11Flas9/JxkGXy2bcU4QHuPfOY8Qym\nXmxgDwNCIAofJ8Kay4S8URBRoHAM2JLdP6xzQi646oCuc2W+F0SYt3yh7dxu\n5K8Wqflya7xPgQ7CxL53i/64jRsHKojqRgGVFEpu8hhVmJV8qMfB0A7Tx683\nc4iISOnVcgdASMoS3SJsMC8cWssUgKULdBSD4Tt/fEgOt/EP4dv9nS96ljlJ\ngXMh56aTO4kyqOtA+AyFpcLIS9StIlA80OTMy8JKUpCS3/aXM2+u2s1BLgb9\nZA0zMdRDZVBA3dfj8G5vAn3+LMT27HY1RiZHdfHY9+htzU2N3HycG4LKGL8J\nZOuVL9cjfsA98Gwgd2zTKlvKApm9+r/hEFdVBBACZQ9hsjE8gJwcP3LDhVty\nvVRmalROSbE/Xdz4nrVCHznAnJmUBj18tegj35ubL0vdgGCEdEPv1v6bbFnC\n65vyVLRHapUqCWqEw1Pbxc+lUNdyNTFrzMmFuZssuHf3AGTEgm1Z3kofgEd9\n8Lb9g3V3ZsypvYjhaMaWYz63pHbYnFR8ag8WhJmaL4pkp9/w8zL7GTKCmv4+\nzSesZJoGBaesWvG1/OdGQn2Ax7/Ttmxcka8tyBIDvY4uBp4gTX30NWpIx1HU\nIJAj\r\n=UMkc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCAJdJ0pdcSMDBuur71VlNvL8MPVebpSO1kqJgx2O6l7AIgH7fzX1DT/D/aHi7a5eMd4pimD2iLWJlAnQgVLMtd3pE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190815011616_1565832010585_0.255985560109125"},"_hasShrinkwrap":false},"0.1.29-master.20190815225204":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190815225204","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3e8d4477d5970b39535aa52391a06f63e6138a9e","_id":"@atomist/org-visualizer@0.1.29-master.20190815225204","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ttIhHMGmx0ISK6nL15x+sNSCdjcXCtkQA6nSbm/iT5dG17CI/YA/UfHpk0W+NXdFPS2QmF46/RIQSnhmtykNaQ==","shasum":"ef46102632cf215f949b0b78691b497e3e67bd2d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190815225204.tgz","fileCount":404,"unpackedSize":4387557,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVeNvCRA9TVsSAnZWagAAOvgQAJsonFKsH6txVyLefqgp\nDhzhwTWNT4GWvrURfu0YATfmXVHsZMU8nG2Dha2Fj3aR8AWyAYLPn4UIF+oV\nTFMJVAZoAUXYmmNtjeHggaci4ueDMuinCAA40+zLwSOD10eBXNHNLAdSPMIt\nb0t2at1ZwZ2L1QYh1B0Rvb8ncw2oxY9rQjboM7qAx/0Knxlv9zhRKHv032g5\nng1Dc3h8mn04N9gR5Kuj0SAz5SzpSOp4i35I6zuZyhUVyknGqGQB4byM5h/9\nUOJRrps/AMvxgKKMMj9PFuH5GJZXM/76b4IsyOc/Un39xAzG1tMALTjZlcyx\nwRgCQTPhePfp/vtnKfcYwNV/YTneT1Ldog9kOY/nAneALFazbbNi5w7GE4J3\nP4mo2N2unV2wWNO8H8BL7Ez7Trg26I+5gLdYJ1Y9HikvTXwz4LrPbPcwBzao\nvr27CmoX03v1u11OSFDt05QvT62i1eZWO1oM0bpQ2iamYE397NsjW3m3300p\nRI5MVMAoG3d7OZHtYp3Q7/lRR9FRP7sQ+WFygXkGRAbgTYsDYPcQ8PYP9i96\nvP3JSFz9oyUFNw0JaGplAcweduNU70+tSbGHHvPa8kvPTtbnwu0F5PzwmFx2\nc6HZSeBA5CjGDlWAgggSfQsA+YEdDEJD2LSv0YsE8mBck3JsSJ0S0lHOcQsA\nMlYZ\r\n=m0Xj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIExNcC96tl638FXk6P7Aoq8bSh3u1aMr/XXLvIaTmVvEAiEA1Ee24meHr1XLaPGHR0HKkWy1G+ujfSFHcdut6I2onZk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190815225204_1565909870227_0.16746675017520385"},"_hasShrinkwrap":false},"0.1.29-master.20190815233501":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190815233501","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"018a3911175ac4d3ec41128d5b4750ae5a18a670","_id":"@atomist/org-visualizer@0.1.29-master.20190815233501","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-A5ssA6srtLsABsNboCoLi4SWQvK2H1tglKyBbr7w2ZkKvqm9k8cJSqITCST4mQtdpdk5j9LH6xHcsiI5tcN31g==","shasum":"b08e55fec5c7eb6d8ae51646c96047ccc1e3bee4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190815233501.tgz","fileCount":404,"unpackedSize":4388074,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVe2BCRA9TVsSAnZWagAACHEQAJBbUIAjP5Yy3CW91Yau\n2BALHGJyIbLefuYjkCM0yvl6Zil0FUPLkboiGTFKINmPnLrNsj5lDV4HVoFb\neFfT+Wa+RzWamtdFc0nDXC+7U3MulySfHps373bV0ziACntKS6Zyk9G9QhaA\nexYzZ5W8UaPBDiTtBe8mdxmMrDZ/sqrGfo0rHUT6nVhslifu9v0iuQAjmO/C\naRL4o5m+sa21uVG5Hpk6POOosys5d36iAScwE2feeXl4/+UsfJlzOJ6R+rNc\n5udtrDYNV8pQtSWYM6S74jZOaeUzXsbmPPLHnu3RKkOBBj3SsJxY6M78SLMt\nszZmllX8Lv40XVrXWh1QvDPt7lmrevCCExMR2o3rBQbTelNCqZfPM/MyR00c\nDXqDb8eqYR9oRCre/AHgpcO9mXsKNSmpkhhc3t+td//eaZ/IgbORloLnkGtK\nWxfy6h0avBKSJMAY2X044agFq4edHk7sDPUACDXNvYLsjU+M9CDRa3mVYWBb\nEdL7pV61XXHHAHI7jQfGt18CBwntpuV5j0pslAyv1gPxdiIOrdb8JzFmXAJh\nIeQfhz6EVEYhLgW5VEEATMM2mujYI5UiK9+EUeUQKQCC5uwab4XtkjjBA14m\n3+TOBk4FrDPXyJySRLreat3/ilGmNM+L60ut13KQljMtn8eieC5YrGt6Qdnl\nQmg2\r\n=5g7w\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZzkVvgflReg5H53f7HHAzLJGbJz0z6Tm0sAaqEw6u3AIhAOQ7t133x5WZSN6bMFhQCcY09xl25BhPgpJDuyRXlGtK"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190815233501_1565912448763_0.0023588013731767887"},"_hasShrinkwrap":false},"0.1.29-master.20190815233757":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190815233757","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"018a3911175ac4d3ec41128d5b4750ae5a18a670","_id":"@atomist/org-visualizer@0.1.29-master.20190815233757","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-q4U3Ggr/OjGiWUCOAh4FphxPqKUBzOGfxlz3DtLDqp94FKRytYkrv5AeGEMki3mvuQtzsQ6frpgqmkCB93vHPQ==","shasum":"4d620c18dba46c6fab8b4c52a3f9e58328a3d4f9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190815233757.tgz","fileCount":404,"unpackedSize":4388074,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVe3/CRA9TVsSAnZWagAA3uYP/3/rV03lzV5wGDx15cWy\nlsaqO8pETWY6WosGRFHM/A9SAu1/AwwZJ9p6kvfCCDozMpAcRomFIfJh3Ftc\nxypJdc+WvFkCB0O5A6chG+IFq8HrPkl7YvtrSBqgiWGVkMzdtPejBv4fP479\npjCgRJE4hXOuwJq6CFXJ1W8MFr5tSN43/vZhkqi61z+yTmGG7vEiyX9fnxVh\n9jAUQgIFJzis5p5HUGCy+Cmjjr6grBOmYhuvz0kUO/xY51tLCal1UhtC25B+\n2uOOYusy+nXGkRnE2lFrfjg4lQgWsYiejM43E651mu7SyJjXcISxu6eGZMRg\nvHZxq+sH/UJvzTJYD8yRfba6XIXB78BCtjHNU7eilMIPw9k88j+e0aqJDozF\nMYj+COsf/+KF1BhZZCl3gghrSgUL5XL8JSTp59M1Q9Yv2ra83LUgVRdkXXJp\nVvGmNvxRVb23wyHerdHpNnJ1pRmBmOcEn5hEbm/OTS3ubJZ9PnFZds+KiHY0\n3nosOlOXa8Vns5FTEFPMneEMk2wMYB5LKCF//Ky2G5wPVBKl5wEQCzjasP1H\nDWEguTuMRkLTSGaL25ezQ/zLs34rDMVQ0kYKzs4/i/J5THc4yYEZ3NrHYdoA\nxvP7CvQntzI2cmStv0oi92AOMRoyK6OfgV6QkEaoRoxetb0IP4RAQMmHBu7p\nI6GS\r\n=2pzv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICCg2RC6+IOOZtDywf6SEkYcM18Y4cIAF0wXqiXz1CF+AiA3uT7iCnrjWxDClRqtFh0f4WKHCN6SzyC/JztZBFLp1A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190815233757_1565912574655_0.8470426740402806"},"_hasShrinkwrap":false},"0.1.29-master.20190816005920":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190816005920","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"40aa6966d11b523266f74abaa7f2f73ae86ffc46","_id":"@atomist/org-visualizer@0.1.29-master.20190816005920","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-wiuuavb10RPxjUVVUxYxED2CXnC31vW4UrdeW7aazuFvPGOnTcZcTV+DRslRoq6Lb6br1mT/rWbthctOu4MOuw==","shasum":"87bafb1e0d41616ff1048900b1562699034965f9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190816005920.tgz","fileCount":404,"unpackedSize":4390119,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVgEmCRA9TVsSAnZWagAAfggP/j9NTmXQSOx6YSLU3ZfS\nn6dylyB0elAeupD1St+1RClSCexF4482ycXiMvJjZ/FAF6nVkkHkONWzBmNO\n6R1O1WeLWeVd8hTt9ujda8EUrzaMVDSxtcX/KBxhwlp0SYLDj1GefiA3UHxh\n/IYbapvafSZbQC4HwiFbQWjXyDwDqaPhLoftZgAL/xkL1SmD44mGtcFHKMhV\nuT2lghJjQG/xhU3FxBFT2xn/4yuEdX9Mzp/To934n0rEyCIJCZYFcbWSTfYO\n9xytY5PlB0bUtVawIPjkEiuijh+JOUNA34i2hnxw30j+adf4TaazB5pq7gQO\nz5dubBMZLHgN/o4duueQMh9ffi8RA3u2Q8aKXC9ywmQc3kWeLxD5bGUAv1UO\nyzMKpzcxRzT7iAMHZW/ptUp85fKIeENMbS258GBCLhcki1rQ1t1Y+dgyplSD\nhapYcwanZlogFoqbLZY2V57qjPbz4WGv/Vrpr5AsrQleFaBVi7Dh9Ehabzbv\nkQ8Xxt4v1fE31gld321/hjCOirfuf9vZBlj655EP1AnYT9Ugerp+I58qhYCn\nB9ZlxDmVDVYhA5lyEIJQX+dLi4Yn/XQJAYt5Zy17xAtpVXczO8civSnHDqp3\nKiOQdevtKsURFhS0W0BRrtZPPytXpAdKMh8qfE797eEAIt9i3iBQo0sGcSHp\nIg2R\r\n=s8Ys\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeRkTwoHW09SQa6qeZv2T7lC666Hc1d/4yASpNrZDivAIhAN6EUKFW76Ew/YszCkqB0DEElugOYP8VpMx+kdQlGA6C"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190816005920_1565917477391_0.7352342811226718"},"_hasShrinkwrap":false},"0.1.29-master.20190816014358":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190816014358","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0688a02e7758cf11df366776c48a1b7344d4dba5","_id":"@atomist/org-visualizer@0.1.29-master.20190816014358","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-BkrHhimaM0z6yAbwBcL9iu1FGSyo8HmjwW/9jMAybmeMc0Q3DzdTFmwCuuoq/qBFnqkUvJBE20OifnaYBWaWIw==","shasum":"d1c886455f6b4346ba86c98b87805867b43ddd42","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190816014358.tgz","fileCount":404,"unpackedSize":4390173,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVgvaCRA9TVsSAnZWagAA3EsP/0SLStClGfO24QHx4gwq\nXcRrTRLYb7S6R84L8IbXL3SzajQhB2RgMySZZHDx5DqGUBbtahg2nFn0uB9k\nDUmBZgvhxlDtdlQoM99/BSVuVN6CuwBo6MJ/kABw6/Z35e2LC+h/0TR7CuYI\n8NbBIuKcKkeEs6cXpbkCO1Ei5Nq8xC6+ijfr18xNPvJHMGTY+QPnNXuKDhxB\nVDAhuEayJV0QvkOfykcXFM36fup4e+oCuKYwqCEiEzCb55WZ5f1G7ASLF1Lt\nwjwLvMcSiwpQGfMuEJPxGGSR5d6oMTqENcjblQCf0Y+FKfc0ZFK2tGpVe1ev\ntVsOnZrJBLuqqibYsJUaRd0d2Hkfh9E0XMAdCRDHS8vgSy5q9fvqwbv1h3mX\nneL+zOQOPdpablUltvd1hS8HpZdxJrm1AMbCXavKz3wYg0fSWxRhRDVKNTP9\nReTgWfWdly1IZfBycgHUkLgXgSFdPCOcc6Bx4d1owafoN0ig1J8uAr/oyPDe\nPFK5HnTxXrWP9nvhponqITyZRqDVL/v5HTIvzDEaXI/iM+ukN1D1wKjflPOB\nFPoOiGIi6UJ5x3sNLpSZH29EUn+1wpJL3HuyhSbKGoUOQGY0PCFKLxeFKmCR\nJlxivTvLtPi9KOpDoRrZ0jF875T2qXoC9wXevvL5IYwrcxsiVo26TL1lnqCp\ngtT6\r\n=lWVL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG/M2t/gRZBycdgFZT53V/B4agIa1MYyuzdii4cnzZu5AiAOb6ND/iMTOubbO6K4L/DdvgTsxJkoCZ5cZGT8+/KZxw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190816014358_1565920217748_0.9896638616552609"},"_hasShrinkwrap":false},"0.1.29-master.20190816015004":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190816015004","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"fa19ed56f83d6c8983d975b29138c1e484d59fe5","_id":"@atomist/org-visualizer@0.1.29-master.20190816015004","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-6TOXZdO+VUlY38NUZRoXKPYMHZRxDW7/v5yLXzqFFXAORRjItITOtUTD/WX6rVX15IQDrpJk7/C5ZU3LdYK7zA==","shasum":"ff82d22050178281555d02dfd567d85fd84db3e8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190816015004.tgz","fileCount":404,"unpackedSize":4390202,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVg07CRA9TVsSAnZWagAAU4AP/0TU6Y7wJRQcjx4Lp7iP\nkuQdlTDcT2ON+gyqE/3wPhhJpFVc++xecUkpPfID+oL7iPFmy47ssvzCWxMz\n7ryeGTSV7sT8/eUpUldoB70LcH7l+ZoyvK6h50ZoCKyYJKEms3w10XiZ5VkW\nWWT98PmdRULatFVIrVZNA5r90WqVOjrs0qW9ocfUH3wttqzOZIFrDG2Nw5NR\nYMY0v16/DwYxJb+/211+IiSOD8IXNlfTeMRLQW1j+iEUMB4DSoot3wXNQybz\nZl/mrdbnTL6irUlYB93hxo7np/qyGZ074UKTB2Y8bYJHLAoEMKKZuIH9gas0\nCvXsYzwSsZay6EujL7nTOMxBpPdKvxXcpMRBQ3iKRG/Gx2n0LAB7iamGnVSG\npTSR8EDsoDRUzByiSM0Npdd8I5rmhtN2Ry+rpr2Ea2THsNMMqk3h55pw1cEY\ncdksmuuIulJaz2gUPI+ZWad/g8ptgOyMhr2Ghu/z4SbX37lchNSZwL6RcHGD\nkAIStlQyw573gdYf6RcWV43C9fUqCYbEHpHr6xP1INVoBfZTuL16a8B/+Aw3\ncKKuEhcQVO8ZdeYzi2N8Cjsphzgie2zr45Z5JVel0jQx9Oh99KcWQoflr+t4\nraEMMT+l592p8BmHgI9kDhpsUwdh1mR4SjGH+5L0CbJPn8CmwTHWH0AfIuET\nyb4P\r\n=x10V\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAu1x1biqWqoWhptqjL5vkKyfa68p9V4K4BXMX6P0O4rAiEA8uO2LypiO7eVRTg2gDIH1d+D4KYR5q5InXfXt1mnWZU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190816015004_1565920570601_0.6548148016054591"},"_hasShrinkwrap":false},"0.1.29-master.20190816022944":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190816022944","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b67f53b24dfc3b24f9679105116df71ee5d8e4ce","_id":"@atomist/org-visualizer@0.1.29-master.20190816022944","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-xg9l7WYbDgg/5lOxerRQFR0+Z0swgTcbrTERN5jHpqEKXZGxD66B8UaM2EBFqew2LeKQuAIcJmuBDvuLUIJCWA==","shasum":"3b203fffee9ff4d307f2789807064b13808b9ea0","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190816022944.tgz","fileCount":404,"unpackedSize":4391303,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVhaNCRA9TVsSAnZWagAAVvYP/RcqjmgAMVBkeUYcwCqW\nQ8veJ4M65O3+UIKhobtlP1zGqNIjSvoA9n56CISPgefe9Flij9hNmpanbnvn\na+fZSkeOy0UxcxvpDIgm9z98HokFOVqgWDh2uT0JAdO2tbLEyoBpTfl/sPXQ\n+bzk3EFzNgWMSRW7jj9JOBkOZSESVzCJ1YSlJ0jmnBa7uTHSReb91pKOtQz9\njCmUT+C/Lif2XYRngc8AHxT8KRnolthefush/dY+5/fcd8Eyf8xY/YW0swQ4\nPpQPo/OPFOj8JFLg7j3uEqJ+6loXZf4xx82/5UtKWanDUajync+rUFlh8NLU\n2DN3pbt+1vujdDkGlJz8dBMnF1zF4oMmi4JGkDEIo0Sb7CHj8PJWUKGg7rHw\nnyHdtTtMqPdfo27LGeK3Ymw5LCrHP0EmOUOEsZTlVlfp2cixBt0d1bdgL5/X\ne8u7svued7F86HLkORsZH/6+h/nWa/6n+8OVAEwTqCBpGwnKrjo5PIxUnjAc\nWfWkjnNXVAjluOcDLvtmLHWv/2usOWh6lFIO5XueePtu/B0IeV4KpXBWrZgO\nqYBp6fPI7+d4Cgr8AtoLDBxz7Hwlk4VG8Bqj2z1m4nW0ulLX3DobfTjOOEt+\nLqfvANmaF9IQ9f9pyMZHjCEXKaWY1s/5Bmsmxsc499/cqfI/mfub9GFa32t3\nnywW\r\n=uKcr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC9TmRjDJZDBPFig9On2pd3+5uqZOs0RrBd1NualnD0ogIhAM6P8SLCW2Ox+e0k/R5rrbQAZc6IYOGSKgSRBopJO3oC"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190816022944_1565922956633_0.5604267926540916"},"_hasShrinkwrap":false},"0.1.29-master.20190816030132":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190816030132","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d3834f887810b815e2502c27816fbba2cf1de651","_id":"@atomist/org-visualizer@0.1.29-master.20190816030132","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-p0B1aW3pe73oYnQiIfCpsnPhyvGsf4LR9+WKrMUtnLI9Nj7+F08RjL7mTXsCTNrMXpMOnA8ePHg4oKr8Wa3XXQ==","shasum":"d55553baf087e971bde49484189f03370b139e44","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190816030132.tgz","fileCount":404,"unpackedSize":4392930,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVh4pCRA9TVsSAnZWagAAtEIP/js1X7HqlhEA2owyaB0i\n9si2i6JFNu1a3UISIkSRbjaJlTx6jOTzurhJUL05YMh+fkcULAgYotoBj5o/\ntEdFwTGKGjWUsKmzPpKHIVNP1UQ7kb2UpEsbN4+LFdowl5jHdqdXuyRNyVZp\nNUfJzSRsGPMZYNioICI9Aw4Ehb4T15NlTLCcak1OtSpfjpnMWdZdx/TARSLB\n5Llqw5r33B19jVJTenZuyAaygmYK6oLb04HJzcclOYsyutQL/TEOP+PjMOMK\n5oCZOBIYfBt23Bd0g/lckzIbclOkfNtrVyVojLl0gsW22XkvVSCfyg90ra62\nSOKg8TjqNi/X/24PhZE6TTWKn6u7yKIzU/0XmVVldU4ORScBxHmLMcMBLFED\nklL23OXVEOhGElk5mwLhRuEN05wF6NAiLlANDVrsZ9DmpZJJMSvDDVwtpRjd\nFH5xm8lhi4KcpGOnu06IYaX5IO7uMyAjqHTLYWvXSx9zoMREBUwO1o31RHO/\nH7iXX+AbSS5mXos7Q8BNmRFA1fbLAG3NfGrCe3HJgteAT8TqNlDPMCzruKb4\nNn72ulTKJIHgIM1pViv8KNlvZWWlILrFij8tHjAAuTyZLVf+1d8vMxQ8qZwM\nlPHtR2z0/8dntRBLxVIVp2tK0HLHXMT6O1yC/eC9vo9RtpSF9vrGWjNc4mal\nRfjy\r\n=9ePU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDPtAj+6WG+wzdpDwuew9gXDEPrytQZS8/7dTi5KmWShQIhAIoaQ2ZGVRtk8iK4fhq6+bpxiuGCeDYBJ+sEUxcJey0t"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190816030132_1565924905089_0.3378152137804109"},"_hasShrinkwrap":false},"0.1.29-master.20190816075854":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190816075854","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `--u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d07e171aef615ae619df0e455aaea25d343dcc34","_id":"@atomist/org-visualizer@0.1.29-master.20190816075854","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-DMYso08V/gDfcYZPH9mmJUTsvWhEZ2z5m7wVfy6obzSwuRbnGwDOFJLH/gIaatyrKKRNDA9sBgDrDGueDY8L+A==","shasum":"3690a673c62574d608e14c4077f3f37a86683b5f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190816075854.tgz","fileCount":404,"unpackedSize":4394254,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVmOICRA9TVsSAnZWagAA4C0P/3Rxa5bYdR4kNI4GAUCP\ndcpDYNGTNqo97+LHTzga+cT4tdDpVg7/ei6HV+FDrcd/YkS1QySDiu9BcLL4\n8GfKP5tNYe3nVeM58KnSHVzg4lSsbUMynHPgLthaSgG4v/jxQiN7ooGmB3rR\nG3225p1UKl1iR/WjKRRUJ3WEGFpkv/2D9ye47rU6rULzHR1qqsWFFktqWPM5\nLT3CQjfeaHFvfgiYEzaE36nyE31NncrE2MaEVf85+G2l+uSRDYFrGqS0JKSA\nL9zfDdNHqlbCSThSyJY5iUPoLD+IAjAFmfDPhpwrYmqoHvNAxbyMH+IAUImP\nUgr9EfwhftrazU8sqStlk7uxvZPhZcgIXw8HYxL6HYaJqYDNCLzwY2UZ7hTS\nVLiELB1uW1dJxvghJSKP87bPAjVtFTemnMfzAYZa7tRSfUfHkhAF6wX/PjpC\nLqP98GaaYbCD1f0E6gbuo/kPvuE1ipauS5IC4Rp9GxI5K7eaPQd758ePx7c+\n38k+a5v24KlAGkQJ1qm25gBfEZyr4Cjf9ec0gqf5o/hEFOFP/vOts+rSbMc6\n2qN2WTyfaIgniZrl6ylvus1IcD2ToQ7n0eLVMCBEJRfwFR47lZ9u57JT0NWb\neEdHmE/i5J7q+VIHK4mTzyzK3i4DIU2MxKORtgO4zUxjV2Gt9h5+PyVIzfmj\nC8ZA\r\n=Ns01\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGpvFY+JJbgie6wrn+Our0W0mxUoNoRbJ+xey+xWXNVbAiAJDbGw7LB2JnGyuQeGb5YdSsFqtLd4mW99OZtuUEX7lg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190816075854_1565942663697_0.5770581575652478"},"_hasShrinkwrap":false},"0.1.29-master.20190816094953":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190816094953","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `-u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `-c` flag to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"722b9dd2013aebbf02784ecc7322bc93d2ffbe0c","_id":"@atomist/org-visualizer@0.1.29-master.20190816094953","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-jx9lwKswV+oNGrXId0TdPZtTalFT1qozW64rfQXCUfDejWuT+X9cW7f2E0ahADsMhYgVDIOCxGeAmO0q5yPh1Q==","shasum":"2c7c0d3ae9ecd61af93bfd1191d3fdc37150ebaf","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190816094953.tgz","fileCount":408,"unpackedSize":4400574,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVn1uCRA9TVsSAnZWagAADo0P/1o+R3wzf88u0wegAzk3\nYzmnCaSJFm/+Jd5Ow+mx5jDPW6/UCGTwNdU6+AjHP4+dJOTkYr9qcOEDQVSk\nRZp6m96RVzBj5B5nTVsJKrjxqQB6EhPWUdNHO7LjzBEWkI6KpRLnLLchtHDX\njHWAyhXNEylysqG31eS3tOrKxorpusZCa1NI7fpNk1QXl45xkIiV0BBaTF2I\nzu/WmMJU75Kw0YGg0C0WqG6HscVdkfpxZalbg4pD2Qt2QjOMQ2NPWSZSyhTm\nkH7Rs5iA11UEslhPGXt2nXl8ixegOI89+08Ey377ZksJIkLrqZxLNqiVQrz8\nPYXTq9/Sbw2HrDlEtoh9T8ANcU0SSo0OwdK7MwPbg7jFapyzaSF0eySM1FFa\nmgHDkdcfQgKmgUUQnwyz62apec71GZpDYYHKryd3iNjvrXNF4Ps/xJzqSxuy\n1GTGU/qu5uG0aQ+0xi28u2T6Lho4BPMlj7gsOJVtGfAmpYaR7dG2cW/kI8FM\n6bKyOppM353L1n5yM6MAtMi/fClx7Xok0FdokFNvb87h0t0SRa6dnOAZSzKj\ns5X7lKm+rfhL99wLtNl2UhNGn5Sv9erBcBc9I4bXvqfxYCOF1zpNej7P7vRe\nXy3IFcn6SyoULUlHP1OAJel1+XOJZdzwjd8UT7LqlD134F5w9c6pishroqcJ\n29tn\r\n=5Vxf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDqm3dzPDoQItCIMFRU0I327tey5q0N/9+jM30AZMKRDwIgBs9R0jSWEMlkCnJuRYVeGcUcRvAKFmV0HnoGQcd5KpI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190816094953_1565949293581_0.6460440994575132"},"_hasShrinkwrap":false},"0.1.29-master.20190816105651":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190816105651","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `-u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `-c` flag to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"87b4e45720a4ecf3a953415aa114457c369e0a10","_id":"@atomist/org-visualizer@0.1.29-master.20190816105651","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-T0kGOWLg6sja7HfTBVyRRrgUwb+kpywbT7elGD5JiwJ2wBbwIXF98wzvlNGY/wMQjXZN2grsjwYru8jKzV90FQ==","shasum":"e08cb0eec29ce616cbf7917a75c3414c7950b0dc","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190816105651.tgz","fileCount":408,"unpackedSize":4401733,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVo0mCRA9TVsSAnZWagAAHdoP+wYWKw7WcGkdlZkbv88q\nqsgFsBUi3NaGZ5Vun122/FwHlGTk6c+MxZ5jYJno5qpKSL1nnZZbUQAiq1M7\nl1A4QRsOAB3W3iYkVdebi99S0oYZP1Aw91crjFGMwa8Jsqe/72sPI2TEPcB/\n1O8mAYQUo4k3zvB0SR3ouYSSOxwJWjcs91Bvs/HA/EonCnkK6l/LykopmRkR\n2FBnb+gwD9aIBFRgYYEiuqmDhTGpKEH3ridgWLwcB9E4O9232yBWiUiB8G8i\nzPkMKMHt6urJD4o4C+kMaZ1Zr69HnZpO09Omh24hV5tj+8b1GMxxxv4l5R/2\nfiFipyez9YLFLZXOFYP0iJW2D0ejfu2IlTvKXJbmLi6I/2FAsWQTbIXSi2Jf\nwtn4uqPTgmDeN6k2NvuEOxs5Rfs3Pjb+8e+u1FHVaS95PNjaJcED61qXG3pf\nWpfYKHXALAw/Egf/EvnZPY+zbz+ipJ5K0fm3R7e1u3n469ifh0CIUQ8dR1uK\nqtJNb+2rKfvtOL948Kq5VISJDP05DA5dhVPrPQxXrEu+6JDcqMO1acToOrcX\nBdoG0g/MKPuGYyYXKl0MYsDWh11oXG3UYhLVM2RYK24t79PoODFuACTe0vNd\nMdZif21+vXuz5oT50Ed9dcu8X532ZW7n/lCWm3l0TG8TP+gni+vZ1Fbomo5v\naIcC\r\n=7GgS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDYPFCamoXoVl6OZgkyMRMJHg9XC6g2zfVho77BUFZctgIhAI/q9moVK0MbWKKipKCwN+W9XcQs59X/7Sqlni5HHEkJ"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190816105651_1565953317277_0.1693548641647884"},"_hasShrinkwrap":false},"0.1.29-spiderCommand.20190816161612":{"name":"@atomist/org-visualizer","version":"0.1.29-spiderCommand.20190816161612","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `-u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `-c` flag to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f180d86fa317d6cb15eeafbb0b3551776aca28e5","_id":"@atomist/org-visualizer@0.1.29-spiderCommand.20190816161612","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-j7qf2mnd9+Pq/SR0dSoPNE/yHhCxBwowwToD+cZYAUFTDGr8Bgp7bpgurH3QhrR7f0vtzexAEnHRZExlsoHNPQ==","shasum":"9b58c09b93dc3734c0f0f04a1137e642a1daa62e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-spiderCommand.20190816161612.tgz","fileCount":412,"unpackedSize":4405452,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVtgPCRA9TVsSAnZWagAAek0P/RNbpQRfxk+oqD0Memfa\nRhjRWS1XcS2VYlynlfvDHougaoL+Ehvll6iz11u87JJH/FBz1/PDPOq7NQj/\n7g8E+TISME+MQVouXcnZHCJOqbODcj8jPNZFjiiPejBDrJcsnA8NfhSjaMRN\n4gv7xeuHx7RpuLxK/QAQX4Z1Fk/LcqQlQQ36XX9J7t77RbXucemSO3H0VsQ2\nnJEGsNSmqqKuZhxwzBNhbAnj1mXmZigsSNz2m2VFc9nfJMGiPpp/S00QDAbk\nF8Fm6CYdWtPudgHlf5v9sfar3rWVQVRhLFE/szDd5EtOqy9N46RP7KnVxFBI\nZCYhzNuQT3ESqihNKWR/kjorFNsrfzbXGznaPdQ62oxJWKrhFFuDlBQNMf1W\n1yxlMvMBjRrCWakJ0ESeu2BUl/fzs50UW7zowA+Jcs/Ej9I6Qb+xcto4ywj4\nmiiwoacC4MhzbHWpUIo0bkhmvHZHmSegRLquuBbhtN6YUji9VbllElw4rY9N\nb58l4W/abzFCjllA7Kjhlsv/5mR5ix90LFNs7GmBW4qTo35bs9zRDBWPAHjE\nyauvTvvCcKgo38qZwcPsKawPIPK2GuRDIdhhpuMc08UTv52olEiTdbqI/vDZ\nJeFP0HA5ngZP7cHqxrde+1cv2v8JemWFpo+EsnIjvvY3VD7/3JsqMnFStujC\nnoCu\r\n=SL0X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGCSisLetzPEcgwNV1g6xc8gPJYFlOllXfCU5apw2CxjAiEAzzJeJAAnsbMjz7meTyU5jZZLYfzha6aztledFK2m9P8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-spiderCommand.20190816161612_1565972495090_0.15069235361451105"},"_hasShrinkwrap":false},"0.1.29-spiderCommand.20190816174708":{"name":"@atomist/org-visualizer","version":"0.1.29-spiderCommand.20190816174708","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `-u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `-c` flag to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4765c61c2939962ffde2d8401c9a94c9132e64a8","_id":"@atomist/org-visualizer@0.1.29-spiderCommand.20190816174708","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-5cZR57oZOKA640desewMY1vNYxtUK/3VVm/AUx90EPI5q3taiMdlkhPyaMB2u7ZpDH7Suxy8OgTLLCWSr4SviA==","shasum":"bd64653b2ae98625db32f76a6494817f08d0c1e9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-spiderCommand.20190816174708.tgz","fileCount":412,"unpackedSize":4408199,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVu13CRA9TVsSAnZWagAAUlYP/1nZJRstEJp6/DHeRxh5\nYksfmTd4b9oy2s+VEF6MeKhQu5V6/LobHvFauX6MNZX5guv+rm+/YHH19/uO\nm76ecGY99J1uFvUuP1wyQxNwXoXfA9fbB8Xzks68beUe2V0UKPejtm9tuEk7\nH6ISDlI7q9+1a290YF+Lk2sXUnA9S6IluwkKRSOaxkBnzcOCLkVEGj6Qogj/\n5/Us7U6HCrPhJNpsGiBkhucaeUSySv5H4KzS9jhcukqfeZGCntG3vG070hiz\nQTn5q3cRtXPdpEUU1Hc2VkjSnJuEmuq/2LJ5qwOG69hO33qXbiko/FKBxkEO\naqaOHyAFRYJYelpOM3j0zN7EkYkeD4QF3TJwpTZiIXZsYuMc8Lvi1FAUacDD\nw9WXal6ClHJNBbnr0bzoCm5OaDwy99Sk1+dckwzGeWARLTocqKT2K7vLMRze\nAXWzSowMYQUHWhqrfabPUaBVQPowpxQuvHuVQriStkrRRxA1CtVXZdwt/AXv\nIBAfHhk0Rpd/QE8qGHcAVkuyMtPxCA9AON3+uvYGNFcdPqrdn1bum8a5vzTT\nwxQlT4zBoz9FRly8NHsyyyGlve7SlFYZfiCK86Zt5Ao5TqZcyiIxHTTZahiR\nw7qb0Vv6HK0Oaaxx17MLSapZEGIikUSJe5WefKYTw5IILwk+E6RtqvelM2kO\nLChF\r\n=nYwd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDxqdEa49Mr9THLoUYytmtz80IWxCsvyXTg905SKxXSjgIhAONUtHnYyylsKhBp6fwEn13I1z3kDcj49HEoz96NKsRv"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-spiderCommand.20190816174708_1565977974380_0.6727155402892313"},"_hasShrinkwrap":false},"0.1.29-spiderCommand.20190816184929":{"name":"@atomist/org-visualizer","version":"0.1.29-spiderCommand.20190816184929","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `-u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `-c` flag to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"363b68fd9aa940c036004f540a61f04b617f9b60","_id":"@atomist/org-visualizer@0.1.29-spiderCommand.20190816184929","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-iGzEvv1V+DqJSU7pZdoH1ZZYKl2IYi+utWOWzN0ZCK4mFNeyLhHymdf59lb/NjhjE6VC4LSg8vVVu2AUZ4FtLw==","shasum":"06d52a40af1d467414248e09256e40a378b29ade","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-spiderCommand.20190816184929.tgz","fileCount":416,"unpackedSize":4410086,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVvvwCRA9TVsSAnZWagAANfgQAJRXpPBAbUpcepQabYAF\nxJrtCTOO8ptU+GyG+05Wx7TmK/3LXcfJ8T1YXpDt8IrhuB16MegrUbUh0XFg\nQMkO91kD87j/wtAc+wec2+CYQ6HiIKc5nbWIgXYh/Gy6iglwRQ6T3zvt3IlV\nQL0YoV3oo1DzdPMmZcMEeAbRNAJEEVofOaMvWI0FeqneWtUwQtUVWE4MiaTE\n9ZC8p9XqECwW5OQIl2DpgeU/z+zYM9OfJvb31t9vKLygYh6SEB7oW9iT1F9h\nu5kuRZHaTfMwzkz6D7Opj3ZlYBKCFmpNbMjLHP3geehRDG7yKtPiKcsGqyxm\nt8guSS0KiBjCTFUvGX4AXZnvZlY41ZgWG4rtQPBoKEnqeSuMKBctQElFUN+5\nuR6XpIL9bZJXmX/GtDRlobCjIbMZzH1eiD+mNyZGYIy8+I1gS2bDabWd62zU\nqwiZ0FcWbdg/Tx4KXCrNE0P23k/qWgM3/6qbYmL5yrT1flt6h9HMg6wmhKZ8\nEFhdA54SIFU6Li2u1TuJs+UnshSxjseLcHHknPle/6MZgk0C++PdLpc05vID\nvRCAhmuzd6fJA3YAwNzeqMfOlocsIRAWtbvyLXgFRl7coMlRlsvNVPTK86lM\n5ltePyGATsfGei9iC/ricGf4uUvNmUygq+z9WkRW4LtqQCfA66bNjuyHiaWW\nJ3pa\r\n=Ct+o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID+UsV0esMxkFQcH9sfoj9ukAbAZ/fLgOtRhpgsR+/fDAiBPTafyUVsGN3S7LkhObKFOkaApb8hPZWlsSz923fK8DA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-spiderCommand.20190816184929_1565981679941_0.20233066905897812"},"_hasShrinkwrap":false},"0.1.29-spiderCommand.20190817002228":{"name":"@atomist/org-visualizer","version":"0.1.29-spiderCommand.20190817002228","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e46ab355edfc1ed5103313f2764ef94a8698863d","_id":"@atomist/org-visualizer@0.1.29-spiderCommand.20190817002228","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-JkYwGeBOabKWauvFdRzq6h6/XTpdizEH28BVqEOy0XXV5K6EQ8MhSqIqHXeSbK8uvJaxhJ52lt7ehWozDrZDiQ==","shasum":"b9ea479ad4a1fd17dfdf572266b0eff644a9507d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-spiderCommand.20190817002228.tgz","fileCount":412,"unpackedSize":4406315,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdV0pACRA9TVsSAnZWagAAu1IQAIjFlBRXs+9ckZXRWO8f\nP0YeeR2adVmZKcw56IY4pP3y6cpD4fbWt/aHnLkk5RHEjDHkrVMWd8Os0tuo\n0bensdeqQfAgjGeaahCszPAD0j8JQworBKDPuAkMm7HzBhvqKF38h7QPqGkK\n+Bcna7xZtW3XWhkdGlnAC06/RjKf9KjNk/hORp8gGALVZPP3JD5KrutADLqZ\nLgSkBimNdeAtMyCFAQkVu6YAJuU+zTeNvrHXAPCXM+vRRoMZeoslLksbFoNW\nSbZW9T4SxxtpQHBmypDp8B9h2ulGTkIhiJkghvvrr1I23QvwQAheSqndyh8k\nsYLgyLF2sqnzUL0pOOJfIa4RhEIlCp7mWztGTCCi2yHcLnQHZMS/ee0CmM0+\nZFy0oYqF7Z9XIGOcByYz5PRe96U6JZ6wukz7DLUd2k0HCaKr2DG92MLp1kI9\nmOykd0KmneZ5c1/7h5i3wl+mXsniDhROVur3lR+QkM24R5AcmqICL2xADjzg\n97eBiR2NZkIS/HyGYlvYkZdMxpLZyDAXWMJAAO5TRNTudNlGboZSl0xEPBJo\nXa1Kslx5ctoIMduJPsYo7OYz2FkSLcG/MiRKBiqzncLyIrmj2HhVaKyzkjh6\nlanqpiR+ZLyEoDsNVm73iDRaYsQ2mF9PooBtL/pj2xgEY5WBXTG4oGcgPVEz\n8GIW\r\n=bV9C\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG8jCP6ztY6g2yGrihmh7Z/I62TLje2JFbisVljVURm7AiAUIz7kglwq/DsGBPp9A/p2G5TpErtkkSUBbwEyiT+gEA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-spiderCommand.20190817002228_1566001727438_0.11982489456168599"},"_hasShrinkwrap":false},"0.1.29-master.20190818023038":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190818023038","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `-u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `-c` flag to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"70ec5e01a36b733ffa31aa3460dd4ba80cbfb87f","_id":"@atomist/org-visualizer@0.1.29-master.20190818023038","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-3Yw5tMKa+7ZcmXkDgAZLunJuovJkdvhKE0S1zS/i38wZtrkGwkE3ShDdd9lp8zTQxC9x+VAgnCVay88FTCP8/Q==","shasum":"1f9f42d764e92558f9fe4a224e9154e61221fa1b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190818023038.tgz","fileCount":408,"unpackedSize":4403646,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWLnICRA9TVsSAnZWagAAeSAP/2FjI9RE3u0R4glSlTvo\ng7c+yjnHLEXkMfisj17+Vx8kHX3OeT4NYABSwALjYktI8AlKAHKBf6r+9eL0\nuK1UHV+zERBwuNJRSw3BllD3xiJjBx8UCalzo+LHcwFCg+bHzEziiE+W99SX\nv6mqa/n8dzr3nZvlKF0tGExWOH3Rxu0rXgA40NVHFYwUEpfpNiZ0clfA/PQX\nFLNMq2NRjYka6odYXh8nW5LTgyJbTJtX8w3KKuz+VNnq3qKuWRHnhIzveuNE\n8EvFmMI4BTbxbalPWIxZKqFYB30W5suSPoAhmK+7SY4PW+/awHEGrL0l2gHC\n1V5sLsnrAVqEeF76FLLFrcwFcgdyHKfSU6sh72EmP3KW5hOhcjT2/Fi9L9e0\nu9lqn7LDr4YDAmjsNzuEooRWqPRJJEztensFaRFwel1EJSJ/MyLSbZkkf5UC\n8Hdpi1P3f3XZM2kvR0GYfc0YzJLsQhipKLtYaVKVEz7VcyvNjHTQg+xkpWM5\nScUF4GA9lZH28b6uHL7zM/HJEVuHxH1Sr1+A/SU1p8pi8ywrKNtPeQuE4u2x\nTYMj+mNaKc9jKBdbby8og8CfVbjmJHXoMLWHr3mCMGERnJobW7oWJC6g/tP5\nIuy4F+FwCgBHVRsdggW/AGJjTfsoa59xlTWadNBHPk7W8Fp50RibX+pawNtr\n6Otb\r\n=RI8/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFGhWL7hj0uCCs+6ZX94nnqnfhB+UmEwBqFKcj/X8i9yAiBoc3fr+mow0jFcQ36nJyBCzem2CcECMzuEr0hCQ/zqwg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190818023038_1566095816061_0.39127091209127673"},"_hasShrinkwrap":false},"0.1.29-master.20190818142211":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190818142211","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"bin":{"spider":"./lib/script/spider.js"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n2. Run analysis on your repositories\n3. Run the `org-visualizer` and hit its web interface at [http://localhost:2866](http://localhost:2866)\n4. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\nNext, `npm link` to out the `spider` command in your path. \n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the spider runs. Check by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `spider` command is part of this org-visualizer project.\nAdd it to your path by running `npm link` in your clone of this repository.\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`spider --owner <github organization>` e.g. `spider --owner atomist` (not the full org URL).\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, use the `--l` flag and specify the full path of the parent directory of the repositories, as follows: \n\n```\nspider --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `spider` with the `-u` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `-c` flag to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nNow start the server with `atomist start --local` to expose the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by spidering or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run the spider again with the `--u` flag to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"cb868ee819cba92866a4df7dbdcacdf79aa532b7","_id":"@atomist/org-visualizer@0.1.29-master.20190818142211","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7rvNgc2O/RxZYh4oASQ5mV7X0aKPdoyFjgHwOH3ypHdtzqvCkprMaAs/ZOq5RWVoA+FRnHWCtTFpogYv+EVlGA==","shasum":"866c9c854a4cf5dba8aac65dcd98cd9d53f4e365","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190818142211.tgz","fileCount":408,"unpackedSize":4404357,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWWCKCRA9TVsSAnZWagAASqIP/0qVaEQe/pv/ywbSqX5u\nebOWV9LExIYC0v2f1i/iJn0rksgPTmXYLyPNf3AkLANeuR6mToH+/utmlOkL\nUYEzVEjtHZQy4ceBCa/i7BnHNYqzH0FoUTOWOEhFxDEI6VrxWUdNUm4FSWGs\naL1RrT7P0jKf37mPVTzqF/xhEx9qtWVVRFIcAdzs7NGQuPtgip9WDqVJWNX3\novuZiIsVS6vAwFJUEP2EX5S+elRzwo++zO/pwPwzUFXaqJ7rI5yYyE8DevjD\neSXF+bfanmtME02NL8jQ3wi6rJnX+8oUbV7BEe0AMUlslRaWZtYB8epIIIPQ\n14IPr0dWJgZ1RXJxWYemUN8bR0SqcvZY1gZ3aDU9/SSuUFRZTNNMerYy+Sux\n7//jXiR6cZvSoi0YvqTZI7afEDdYksYRQUWmqBWWcqdSc4ouCzThSoRIBt96\nEIlEp+Jq7dJWkPnNg9vOuKklmvqftQZPqFVEVj++fIQp7tfH3PIb2iXWRmXa\nvhlCrKOfzBOWO8i/z1SP380LxALy+5BCUpWkmfy+IY6QSNZgk1LgCpHzvq81\nG/lDhIt78RyT/8HcOlvEn7E/CyYTeRu2+5RSWLcbUz0XXqbgNBuRzXnzZkIv\n0fThSzQV6Vagq62r04uk+aefZIZdzOXnumhaA4KiZjm11780aak5dujm1Tz0\nPkoc\r\n=eiNM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC9CMN6JHUE4DOFW9j4XhAWfD7I9xcaS7B5HQNi6VquIAIhAKMfIqItpEuQE0W8pB+OANV/8tqsF6jr5bOZlcn46XxZ"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190818142211_1566138506128_0.39025977986277893"},"_hasShrinkwrap":false},"0.1.29-master.20190818194258":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190818194258","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"dac10f5d4ea1d2bf08ec686645d2a6bd0acabb9c","_id":"@atomist/org-visualizer@0.1.29-master.20190818194258","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-XYX7AuwVK0n9cFWU3Y+POpgjKwdmYPqwPUVFcHU8HxNgJwy5JFfZCNUlPEXyusnSIT+QezJwfQpyyPyDqcEQqg==","shasum":"df240a6b64ee7e831cd5d0b8dd758811c08c81eb","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190818194258.tgz","fileCount":412,"unpackedSize":4408938,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWawuCRA9TVsSAnZWagAAf9cP/3FviN9e/twwiatsu38P\nhgP6H3BQ5OcKQQ1AwnQFLbK8HLNtG+JldU0Iz3I0ZLSGanntSrJpjEOOW2Bz\n1DHyfSxG3c0/8VXgpmiaRacHx9/oAI0rfSK+9dqll2A43l7cVA8wua8oOFzc\n2ByVKrvfxFIKdz5faMCgfe01wo+rpZcX+85PqvaZfAJ7bw8Nq0oWEY+8gcND\n2Piqk9auo0aoiJc5vP2jSMBfOITEETlmqNbI+ctXsh4tnTesuAdmfYCqeK+1\nwVx2Ld4A9rUPmWX+YV8Gw1Qz2OF2j/l9O6NeZweQW1PFH0ZCfpcCnDFC22gd\nu5lMLqlZ4w5pBtsn46sjnqK8vOpWgCE8l9cRJbyBRPuFn+ZRzRp7X4oRCE4J\nBt8ymkf3VRA4H14R7jP83jk7sSpXgOT7s6XcvwNrKchiHoOPAie7y3S0DpRp\npKjthFOpalGkpMdMyDCHiJOPRMnwQvkzXIwFENaS0Ne+pXJ5h5oTW2WVT8I/\nNB4Mvb+QiNOY54EZ/qkRtcRe7cXth+3M1ucub0E2y6peqWgcO195iSvqYLXT\nuxaaJmXlUMXiCyuQ5rpaqH0WmIwLTHtcfl/fDEbAN/WQDAkPOUnxHKnMXzqq\nhTZsDjfnwbFi0U9UVMqdrlj0AmBaGIEyKFs2eDpRhcBxHG79yvCOc2tITqIi\noaLh\r\n=7SzD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAKlGbI8nvKEWJlJ9MhtKBVY7tU1h4dreP0Av32WXBlWAiEA/JuqLPtE7QT0YFbrx+vgWUVH7FPtMVJfm8MK8eQV9g8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190818194258_1566157869465_0.8063942947670106"},"_hasShrinkwrap":false},"0.1.29-master.20190818200321":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190818200321","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a729bf9a2bbeb5d67a224a4d7016d08cfcd5fd1c","_id":"@atomist/org-visualizer@0.1.29-master.20190818200321","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-BrJiUJQDQ6nFfcyNrpbzG9zkZMTdukcpnlxO3GWZoOs2dOSeKAx4x4gfACGLoi5jl53ftUl/4fTHLvk8VymguA==","shasum":"3d4a51c5063cdfc21256305784072005fe35afdd","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190818200321.tgz","fileCount":412,"unpackedSize":4409043,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWbEVCRA9TVsSAnZWagAAgusP/jMxObn/vEdWLeBpIeqv\ni7IUHybxerPg4yLNmxi3sB1GMWKzmLlPg1xZuNt5LeUImL6PUFU+Keleur80\nisha6Tmr0MvygnTrCj2AXW7prfW5S6X0kWS1fGGWHh/VUZ8QrZMZhXg2jrJA\nHMzyN6lNlWlSRZQSkL4pGe3oufGjemnjwoU/Uy9Vix0eM/5DNhn3JcpYJN2O\n/dXxii/wdTLBo9OtfMc2pr/7avXMS9hbJSyGHXstDZ915nZmSZ1AQ2qjmfnD\nhRkqVDs44aIzifDpka9raKYAhfAUzXhaw6WtwAtmKr5oHvJMJc8WXO4AwMYf\naRD5Lidvobqo3pImhkWKTqvjfJKEUUMTR8/IeyBKCZ7bmVtUAH2010L2TWdU\n4yIT5TH0a8XYnKv+naoU31rcUwKMTlP9vottN5b7hWpVtjV6UFSQDRtxHOpa\nJAyoF2M/s8jdTFd2uNIoqiDxbE/cAubed6CwdRevBCZnoovoK7ynVubgY8Xm\n8j+vZsUxrL2u/R77CfdCihW+x+4TYna3J/zC20pve7iSqAilCkOtVGPetDjh\nwQ5Oumrchr8ffONfLT6bQIIYD18ZtodDHNFMJkU2TbV/IwWhBMf3w+N1DpR5\n/18XhjKxIIyJYQS11GsGkRv4sc3gWPsOuw0q/LlijKQGzQm2Yfj2WuB/3raq\n9Bp/\r\n=mrgR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE+O3X8hPse88utyQW7aeWLeVwSDt34tSmn66/PmVBkZAiBp0K1rL9PCV2Np2zoDCvS6oc2vGiIgRg2Agaft9lhV/A=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190818200321_1566159124996_0.4128681212964045"},"_hasShrinkwrap":false},"0.1.29-master.20190819145346":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190819145346","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"2.0.3-master.20190717104008","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"281988b0c94fdb1456c7a1f73dd1f87f4be85269","_id":"@atomist/org-visualizer@0.1.29-master.20190819145346","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Yursf9ZFzb/GoW+2TbeJ96BA/RW16M1Pq/c2dF5MY1xAqx+PGEdGI+XdshLwP3LDg2Xhmo7/pDhhMQGcbke7sQ==","shasum":"2d934d22c8c6804380ee710c0e098745f3297d61","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190819145346.tgz","fileCount":412,"unpackedSize":4409223,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWrjTCRA9TVsSAnZWagAAy3gP/RNfflxhRz5Ix7QTzd5K\nBbeG9qWzHsTvz4R0GFBl8LG2/XM1Pucd8Gj6JV89yGRlv27LHSRnjHv9WBUR\n20xmMLbpRjcg7Et7qiyRcIb8NWNH24VM8sAj/Sxix3D+GbM3L0Cfqai25LYp\nnrFAEMNNCzcuFGLZA+az7vMwIm1kZsg31FGJifVkfFnvTONjClBYib+bVEPO\n7BId23I4ujMSOvmWSPSjQg6dVkZNljn155m6z+owxJqmyJ8qSrxiNkhdu74E\nufAFeFd3vzPSj4tv3ZfAwpye9+sTYsLV4Yl6hXJITdfbY7EoiPF1RaN14Aa6\nXpdgYTFIkh3OBw5UiFT2/D9LiWC1nzHlhg7inZZsNAd62iHJAQ3YaKhm64y7\n7zSN6T0PjLF9D0Lg6F0C9F9ql5Zzd40uXiRM4egFjqghisRjVzBQOGcJZpKT\nEp+tW5ZsX81iDmfmB9IveVOTZd/EFXgxe5kNSKynuJ7FLuI6u1fxN/27Jv8g\n59GwqbHPvRtOmZflB+HINZZyb6YSJqZDe4/ujfg/xQ763D/PmGSSVHmE0mO6\nRVUp5Z0LxpEi1cupYxWCTWBLUkD7i/B80oNXV8jWJ5/EzoSkAFjsRybYhPlV\npSLoMrUJOkC1VW1fYUxe24nrXCYHY+zJFIlWPmnak9575o6glq6/3A2utzzg\ntHSE\r\n=wAUQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDSw+0DfqFsRf4tTSYO4vC4eG/88PQXfhvQlJLzEFTjdQIhAPHOvtEGkdALXht9TWnjwjT6MXc8bE4LGb4f84lvvxOV"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190819145346_1566226642785_0.8802362776818751"},"_hasShrinkwrap":false},"0.1.29-master.20190819155743":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190819155743","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"^2.0.3-type-fp.20190819152351","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0ee6890987946098a931db66697c998efbdef4c2","_id":"@atomist/org-visualizer@0.1.29-master.20190819155743","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-qY+DX9bddgLTxluX0q/WTXrYp0eQe8UxbqDK2jH4y+Onm35K0mB6f2PkErGwieb5291h1uPjGmeZJ9dS12m/Fg==","shasum":"e480c0d7908a73a67abdac9b0f2e08692089fbef","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190819155743.tgz","fileCount":416,"unpackedSize":4411387,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWsfeCRA9TVsSAnZWagAAgTIP/j4U+UhCoGNBIJ+JASfT\nEn0UqDIrhsz7Fs2eOZXcHDXQpVJvq4xK0Kg3ST+V3sQ9a1Op2YJAXCO3/a20\nV9xwZrzVR7Bp4w2KW3PYwpNLipzkwXa6nl79V+/lkoAYovi1fK+ZUpbs13rW\nh+f6WTffHakc71vbRhjXUtVTcuVnET85FgWF77WIgiFXXvWcaLWBwCW8vPbw\nRvRRC1aZef+LanSN2mQ1t3NPMeSIQ1dN+51SmW0pLQ+PJGsFkYTZk72hLktF\nKL1LSh57O1Xi/BxsGuh2C05mYUb3QwqkB+b6/vniphDXOTKSoSf0YY+ZvdDu\nEWzDqV45IaT0tdyV1T8qltHLt7cpbbjrqonqqrz+LvA5ru6DwMYeRGHRJrO+\n8DTqdSPi7aTYJCFqCt6ZDdyptDTe2HclzW6ctj61+SzN7BEOhkKqM469/Rj3\n2LpNDeD0lssKe2wPwI1czhrPsW+FbodeNVU4c7Fm/TwGN9vjNkT0fEAwjd0f\nYzGPF18TO6iMr09u09FpJ8ZJfQ76w/B22aRG7p+e6KUktu98cCAILj3/0Fwy\nggH0Qd8UGA3+GDcXyZ7tUT/g9KahIviTiYXZOj7ztZMXm7yuvdSUnB7cuLPV\ny/95mGMRAv1yyROPJ6J8jTb1TTfU/WiZ64+HuI9agezhjrOvFBFCDsNEZb0g\nQNyN\r\n=4wBJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDPz9vtZcwjR21yb/f58he4br1SokfX0kXca7G+NTQdSQIgV5VH8z/fHpn/01kCL4THh4DFR02NjLdBDMN2S/wGXmw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190819155743_1566230493491_0.5097700510381744"},"_hasShrinkwrap":false},"0.1.29-master.20190819210015":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190819210015","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"^2.0.3-type-fp.20190819152351","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8c6159ba9f8ba5b927fbad235bd57ca7d062845b","_id":"@atomist/org-visualizer@0.1.29-master.20190819210015","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-hM+2mcl3UQlWlJgIWjo2QGoYfvUCdy4Lq01inr45Rfud7CSiVXOt7DqPsLor/DPM2Qc+DFmprQHW5JZK/4NZVw==","shasum":"3a6900bba4ba755078421e60f592d033db479b34","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190819210015.tgz","fileCount":416,"unpackedSize":4410907,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWw7GCRA9TVsSAnZWagAAhYsP/0y+szdDQdmgI5BAu5xT\n1ubmPoQ4IMdgTj00krvFrX5uqtxO56rZQshaIeVAU+/UIzub+UWpSXoyuU+6\nQzw9sIh5zfGdoOjCrqPW4ugBDrGGRFdqTh3c59OmQP+hDlpHG/UFTJozdSgE\nb8BRmf5oBu/ewZ/yDZ498shUT5itMftBXkatHNL56AhErDHojUEWOtk4p9YP\n07N+Fg+ScolVdCG2mnBZwItrjSXeQ3WqVxjsYhzSXjPbGpYgCyxxN0ZB8Rom\nMeQzioySmgcHB/nu7JHZOaSeAqt6BTf7RgRpDTympkg2oBKs1o38BZZ4WHLr\nhjTYdEC8Rx3H06EqvsNpUwf5S8NywbIpKP4OyVED6gg5PtzsB91e/D77jPxk\n6Wyv9LFeLg6zdNBKWhg9n+o/y6fb+tXOPyBiC1/6QooW8RMhXi02sXLzQRLB\nxmOynBIBl8GlM/SmF6NsP3pAEKJyqfsOLJUxYZYEMQynLpezrvMB7JIoXe45\nNkHm2XpVqoG6mKoKRakvgvOpzC6AyEpS6LD0/xN3AoboxrfNWjoLbNDKQ+1X\nyyUYqO340OVknFIUsy7Hw3jWGwXEFB4Cy4Pqc0NhjcoLRPHvzcq8LL3DslkV\n9iCdVojB0nWU9oBBL1JuqQ+Yd9iBMKBgvrXUts7qrrxHURT4cmdHkifE3Y/H\n9Izh\r\n=9Gp0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICrgwwNschqotUkkHlA0gbf5mpUtaxRM/S59zpq/WYpdAiAfdqPM5VgPp+YNd/1+TW6XygImciivMtQXiODir2r36w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190819210015_1566248646179_0.709873183636542"},"_hasShrinkwrap":false},"0.1.29-master.20190819210851":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190819210851","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"^2.0.3-type-fp.20190819152351","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3eba4ab1cee280f3a388b5d30f4d1d22b52a8802","_id":"@atomist/org-visualizer@0.1.29-master.20190819210851","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-M58r9jvLDph6U1Fzj9iKkwwIrvBMqVGTM94NdYaEfz7YmEvXf/Thobh4pUxhqfsfEe1r6LNreRCY+3F56U/3FA==","shasum":"8399a415ff221a172a5f7a54319e344005e36b2a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190819210851.tgz","fileCount":416,"unpackedSize":4410875,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWxDDCRA9TVsSAnZWagAA18EQAJBVAD/8/cfB3Tw7DGXh\nvtxPgYP3YEl6258T2vNJ+lOXQv3IiYm3H+Xxs5PKD2O9RfRBJj0/nvfbTMfK\n3+TH2PYGmxBD93zbkCWJT4IjpYNLCZw6htCa0pMAJPetdS/yRVdYoRmd6xgc\ntqEW3w5tlWCy6jVFG0KP/nnyKx/aGdvjO8kjSV3pe+FJOF83nFAUf49z7P6w\ntQzLckyG0bsJsGmVCFrIeZG9pQQHVN+XnVyj+J6ZOgRjWvgRPhYc3F31v0Yg\n+69Qw8pD6M2QzeTaGI9bf7N7pZVDaBwTR1UcKKKTkzEIG08CX2UxtbupRbt7\n5IdZrz9xIbxWjdV2M9sN1070txUtsaelGK2Mpr6NgDzgG6yUewDuZFJyA7Qi\nZZIeRZer7/AJngiPHSrLCyQha+Xsi2gGRmBfgZiEvs2ApYHJdJtaFTroJijk\nY64mdPq5koTV0581ixKBucxm7VtSyDykFvSUiA3fyvoRLUPGctJmAmTMDt6W\nYuNYjqWpCY0mgJG1eL1FnHmruXTmd5Od4UByAR02RJY60AErRfZypL5r1uxC\n7RwM+LBDwD2HNXlFhMN7JyIHHluhmEP1VHq0xv+aVJw5p7XGn6Y/5IiQ7a4+\nPMXaDJypEtAIYPkiHb6Zyl2nznP9GYCED1jOPJaY35bf40vai2fx3V5LLfO6\nN6vv\r\n=mMqU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIClehed5Cr89BvNxOjeDAwbmHQgtiFR3dbauoRUPUWPbAiBatUzcDd4A3v5+c3YKUip8OBciPcV3/T2Y/dSJQMxkag=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190819210851_1566249154632_0.6589959779842063"},"_hasShrinkwrap":false},"0.1.29-master.20190820220733":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190820220733","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-analysis":"^2.0.0-master.20190810012404","@atomist/sdm-pack-analysis-node":"2.0.1-master.20190717120834","@atomist/sdm-pack-analysis-spring":"2.0.0-master.20190710155749","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"^2.0.3-type-fp.20190819152351","@atomist/sdm-pack-fingerprints":"^4.0.3-multi.20190808095000","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b804fabe02af721a4ccbe14b699fbeae687a2c41","_id":"@atomist/org-visualizer@0.1.29-master.20190820220733","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-babKKlGQIMlUoT848tdLxm0pzcW1poaW68ga/8GkMa+UqiVyhVTxcM6NpOd+xavGNYnjWYaVpAUhiStbtWaKmw==","shasum":"077b68bf8cfa22826538839deb1e3a8b94c0c829","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190820220733.tgz","fileCount":416,"unpackedSize":4410941,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXHGbCRA9TVsSAnZWagAAxXEP/0r62I9cwa5SuwWXDu8g\nKpoE/XBSIghjGvsyKDTlIFYEfeJ/RQGVGq+JlJnjA7FEuu+Nxc9eICYUWQNn\nCc1KJzWvVeDi6HvOuQjRZrFezll6lZAizk6xUrtpgiaocfAu4aHFOxOKuLvB\ngTrZxdgNvDhQc1gKimlURPfibLOiJ1Kf7MpcGtJK/OpfzwITH4lwfP7vkNKZ\nksQaIpHb6VsqaMfCozf4U22etJNcrNkqLVrU5Q06zETQWi94l7CWlUkOrXzI\nL9wI10+hYyyJ5zMJSD6qxvr6yQ4ILSX2A5tkzCX+OIt5CEs1clwpIB+cYeOU\nyzfvKiCcEYEP0iO13R02buGQ0Twtkt1fjCbD0/RuPd1ia3E28SyJC6SpeMDb\nkL9QPIOdJf8tTxTFxVNl06kmj4vTtvkv3tTNhz+Rqe7P45/CNk70PALcoREC\nKqi/kO8I0yg06CvAY1wBCPdTEZ/AZugVRGLu2d+MEoM+UmxBoHVy5E6PvdYf\nNUISpZHF883s/y5Gy7Sh4QwVDYwKlqIoD5CA5IyuN/ajelW0ozDt3Rvbn2jo\nQnAcTpvRwczq0IEhcMB4yAhzYXKsjiORWAivBAosWQXNd9gChBgWkuT6j0hl\ngaRLnj/PsqwzsjAcZX/71QSV6NzAp28VtQkD+T8kl3F6buixX+OFC26wQYJe\n5Nq1\r\n=Rdu0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCCkw8/r9cmVEWy9N6+P9l30hOxrdUEVVQgdvKSIDhQEgIgCiDZIlUVRU+BdsUysydyQMLJ9fYIgzLdiMx2wbipj7g="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190820220733_1566339482591_0.45375216705828914"},"_hasShrinkwrap":false},"0.1.29-master.20190821000049":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821000049","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"^2.0.3-type-fp.20190819152351","@atomist/sdm-pack-fingerprints":"^4.0.5-master.20190820184139","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8bf3a334eb76e6f8cea7ad0c8581f3c632d907d8","_id":"@atomist/org-visualizer@0.1.29-master.20190821000049","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-OUGvf1DpiKPIUOPhj/90vRg4H+VjxVKqGmz/IG7qVug8lgeIPgDXl/eCIXd3cjffUqVR1EBpqAiCiSEnS6TOtg==","shasum":"c22bbaf7ac270cc97ecf7abae68390a99cb658e9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821000049.tgz","fileCount":416,"unpackedSize":4413402,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXIuaCRA9TVsSAnZWagAAwLYQAKIAl2lHgauyiz3z40mo\nVwaeemaDp4z8JmPNizg3WReyuoWC4Nef45EUO+M7FXJ322AL3+ZDUMFJeehF\nwDkwg6N0hmGtO7hoIRjbqamGTX2poEUPV0kkGZzZExyF0ouAHyAo84x2Y/1m\nbMrE3Dfme4oEHz8UR1ynuEC4zYfMX+/kmwfNx6xiGvaAFVkzSdR7vtbYff0+\nlsPoR3Am2D0CNQrZYfyFTxNvj/q8GgQ5/MBVskYWyG+JRCfKvDJtVldbSEjD\neoAHHLyHAHKlXaPKyYobGTb+BInsTVfD4pLFp98Zl2ZsDvbTgvO6xH3meW/9\nkWpLbS0oqOAxBXusRDwQHDL3TgAP7vzy/H8+C8Oe4zeNl/f1iuCeSP0vCsGt\n/T0PmWWoVRXDStMOU4uBGyxJu5G6SV6QpQ89aX2BxdwycuQUyfRD01pf0pQ8\nMJmOE5DK5GU0r8Bg+wyK8IFkw8jw0ow7Gx1ja6D6I2S+Ah8d5INU1m8HiIhF\nX2VcdsPBeuIS43XNGe1Wbe6SQdKUuGXwkbFvIQHqLtoBMdaqcR/D3EeckSlY\nJUNuzIUVa+tXaveKR7RNUv/lOSEMtJfzWa5tnHVGBVcYyyRrUOL3K9+UGtwS\nByoYY/6rUdUGlUexLPqk7DE190KlnOK5EoI2I9BIePyYq1s4zEZch3mt73pS\n25n0\r\n=J/Q2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPNuGTYqArJuPzfLndeh6i+Xrnk2FqUGjkFev0qa1xOwIhAKJxEOKGH0icHnixzg89eRf9P4Pvtzl6SA8Iwatxt01a"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821000049_1566346137852_0.36718709278168693"},"_hasShrinkwrap":false},"0.1.29-master.20190821015907":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821015907","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"^2.0.3-master.20190821003654","@atomist/sdm-pack-fingerprints":"^4.0.5-master.20190821001652","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c82f484e2aef57997e2126a4474cb5cafd2c33ef","_id":"@atomist/org-visualizer@0.1.29-master.20190821015907","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-K673q9C97u9oYDIc0nTG89Wyrul/jD18aARZh5RREQK1MEnHqhM/+JQg7rJtDSEx3Az2xulEo08rSeAiQ6Enbw==","shasum":"520ba71179718fb1c4e43a1e110d017635add78c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821015907.tgz","fileCount":416,"unpackedSize":4412496,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXKePCRA9TVsSAnZWagAAR4EP/RiTV+CzWEDiQXAsc8Un\nlHZ4ZGGC95Gw8sJKtgbju3slgLMTbqFqz7afQJ25Y12rpMTje6jDKgr/U7Hj\nw30Iw5S2rPIBUezhabgocMuJYB57U6U6gn2n4HzxnhYNg/LOIcRMUkGYAwvA\nrgI3t+BsXhJTXdPYrLXR5fAc69h5VEZOA4GW7SJyFA9GxeDXaE/b47Q2PZav\nJbKFnvV2XTVs+fqirW2LaERRXFeQafQs5Lc9y0C2WxyVW26PQP1FjbybtLdN\nR42+X2h1Vu8vS99rKTNh40ioa0IOI6rkDqrFnDKDHf6FjCb9QYR9nLTIAfC8\nwfcLtFQ7ertaXY88Tbxko3O3VZugZ24pOHVQi8aoZTVjugHfHYbY+vP9fiGo\n09M9CgoSc0WMf8RCv+PLluBLnpkZKpe8en23LDMO1gOmknDDbkr6iD2pk+as\nc9oh4e4R5yYXfgXSRo5BmZ641i+IhqG9fkDlkYE7IIaT6oLJnHfoPjAKrGED\nFXk4Fs2QXwgmr5leRO2hm8OT1pGAQlmDQ3f0lwLbBZaIXxXbpQM2Ul1XdCGt\ncAYdSHjrdgPe4pVuSqtileYXi/jtpX/mo3hsBE283/LIatvFvhrJMKXkHOON\nntzaVWmvA8+I49h2l9oLs8epvJhwyXh/uNhocJMD10nvGsOv/e4BuuEv7ZI6\nkMyf\r\n=nFuD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8aY1VoBxFe9V2NAbBOoeOCPcrQKFalwuxm0A7ctWZcwIgaiL1iFOi+T9hpPJEpfT4OiIUmuOSO/ljqTp4HZlFfZA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821015907_1566353294394_0.05312090397500868"},"_hasShrinkwrap":false},"0.1.29-master.20190821024702":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821024702","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"^2.0.3-master.20190821003654","@atomist/sdm-pack-fingerprints":"^4.0.5-master.20190821001652","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"065f05353e5b270aba7e07a0a839b8a9d5ed2206","_id":"@atomist/org-visualizer@0.1.29-master.20190821024702","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Dg7oWS8p1FPSzhQovf2eWftun/1bYvW59wooDDeeUmmOgGdnZyLhqDRXKAaw9/Rs0vX8deWQTRLjPF2kM6vFRQ==","shasum":"8e8dbef5dc3a0f43ef66a8141676755466ad128f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821024702.tgz","fileCount":420,"unpackedSize":4417478,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXLL1CRA9TVsSAnZWagAAB88P/3lHV16TldxKUwF3eRb+\nQ30dPmBZD7rUbFGt2HlZdbaNtrFNCz8IjGWctiDQJf13OUojDqrSb1fNQfUg\n1fM1Z/QYnLo5appo+LS8qQSnu02WvE3YjeCP4Wiv+uUy3+0TkZDf/0t0JXOP\niVe5OYHRnbJRuFM6/+ZZ+g5xvwl+RRO4sfFMYcXdNyUw/DiPjZWVXGzg2PDP\nNMagblAh8zpWaX/sAopV8BEKAmUc9lJfFtPznsLU9vJo64vh4c7ohJLJQgxP\nAEpsLPbWFdIcOPsZUBizWYtqNiNByGbj4C7dVHRlnS4zukxe8+zPSjklPoX5\nxKwnU/X2XzPEkAwksvDO5Oxd4e8qXpBRqvQgnBmV2e7b4/SIhxDn2LX2r8Zi\nE5LW14u3D0ejy3IZPeT3PbF/faQAzhtgqhpen4GBNKeX7kJPezIVopM0TH7T\nbf6nBjy/HnYKIYg5qqUm9Pqy8gdzU/SDYcF5LHZRmnlY+uNVEw47LvhvrQkn\n/lkdZKRS+AW8iouc4VGaOTsCF2Wn9wpVqJK75jBnXYzpVLa2inLHjDr+4jDR\niOjTV+GK866G2fQjF6VYH5zLXdj6tGogbhtZ/uHVTAVZjlhXesakT0AkFYcn\nY5kdOTctF9+HeV0IHPAZEvPlNi4CDbBpwFSXrQ+XJEoghnUEP5V6Gs0JPb0c\n5uW2\r\n=GXKB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCBck+k7L/cAUf5NypLtSYXGKh0+9iDXneSxf0ym1XhQAIhAOGZ0Sph1W0ZvMOkHvMmcPE1LtlQKG7QDOuatoP+nZ3u"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821024702_1566356213172_0.6079167413369067"},"_hasShrinkwrap":false},"0.1.29-master.20190821062135":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821062135","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190801201049","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"^2.0.3-master.20190821003654","@atomist/sdm-pack-fingerprints":"^4.0.5-master.20190821001652","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` constant defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport const Aspects: ManagedAspect[] = [\n    DockerFrom,\n    TypeScriptVersion,\n    //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"79403e8a8b42f35174a0b6ed95c0c4e79be6abf5","_id":"@atomist/org-visualizer@0.1.29-master.20190821062135","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-iCYLIpZUprVbDbYF8xkEpsRjrILPhcHPi0yiGpldP32i2mTN8jW7140Ymykf/pDaLhl3w42qXZprU5jWYTxI8g==","shasum":"5b3102ad50ecae3da6b3f0c1a6c7f373ccceef32","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821062135.tgz","fileCount":420,"unpackedSize":4417608,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXOQgCRA9TVsSAnZWagAALTcP/1+sH2DKjVx8CFAXd6VJ\n3M748bAFGh8unTFLCoOPU1YsvqmK6rAhlENJ/u5zayMxR3fxgUFgF1Hk1O2w\nXZPSSKilqdoaRFt9DTPCV7heox9LF/vji4S+3XKhZVhdAKBzKm8q7Jucde1X\nYX4VNIJwAnvBgC4EOafnWkDhHBtu/ZTVnyeCs+mkOavHVVde5HpTc9O7m6no\nOzewjHT4pcqxZTQjO05ea82USL7xd8AkLaIrCazWXuytCvEql0fSQWwmQy7q\nr91uCkEkQaSSlxYk/iqtPOTZ7iMr4n+iymFudzFbcsmCubpAmRYvdQfKAnM4\nPBiM6HjjIR1dv1lsG3Xi8nk4CIK7ksKR+Ms1+ydpkpzyfbiPuqXiJOTDmNl+\n/I7VwHUrqF3bQKQSrnHL6ifjm8sHFV5dkFJ3G51h3GklExo9LaUJCTAYADtr\nrcmOPrz0Y2OaEL7Phy1QN5I6EJ/XkKtQNkqHoyvy4C6U/8+5dAwURv1ZYkF5\nq1jtJ9oEyRHi9sPCZmJYhV+5t70Ldcj6RVj7lDICBD6Ou9pY2JeZGmfpGZhG\nCEKPUhRDtKNiF45ix85fkcB7bdNt0KhsxlXciHMMnMbTASxX2PQDWM6Tnl0u\n0K9hiDx9Wrp/9cpS7g1KANGLE4w3BmKGEObYpNhQtdhor3knCf+ZT7JFMMzo\nsysz\r\n=yCDD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGX/UOiocK5dwbkZBnH/biTXjDB02Ap9kBxD67xdMgBWAiBxeAHtIG1jwY5XaFPFMgY6ans2sa66DrSuSNpA2KelXQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821062135_1566368799308_0.9372462898630562"},"_hasShrinkwrap":false},"0.1.29-master.20190821104121":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821104121","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"^2.0.3-master.20190821003654","@atomist/sdm-pack-fingerprints":"^4.0.5-master.20190821001652","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2cf6d354ecca3fdf09f6e3f3a18f1243be48078e","_id":"@atomist/org-visualizer@0.1.29-master.20190821104121","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-X1QYBEAoaxj6y1BdxrcD33biw7FPAJq5maKOnYWSeAKphA210lO96yzXstbwWWk+kVpAAz+INj3bPfxCfh/ZvQ==","shasum":"75d46d54cb5d9604d3dd6355b6a96fa12ef8264b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821104121.tgz","fileCount":420,"unpackedSize":4418647,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXSCoCRA9TVsSAnZWagAACN4P/2hJLH8IRcBTEnMo8Fdx\n6A6LTL4aG7br8pxeQ1Kr5G4UwbYZ6XnzEl3agUzkXREkV6mwLI6FwXzWzUFW\ncJyQkZj0n+Dkq98a1azgG4sEk3WPjgXA6DdNpPEwaiT13rbZoxm505/1HvTo\npk6zg7C+KieIOabyZ9dqFLvJchjaeRtFnyznwSkDty1/yoHqsgyd8LCqooTa\nFMVPPnMkAbR9GR+dM10LTbKQfcmswuMZRsuqPAau197VazFQDtKe+26g2i9x\nD6tVxgAsQEQo41uxDG0PjY3slJl+FwXHkP0Q1/1N+10pc6AAkIr77wLB84cw\nld4Yy5KmlxWR9cBTAosCVrZn25Muv+d7VzTQrA3vGsJj44MwZOzqvP854jtK\nE8d3OhZgqnUBa2JzCeUTE/nBRB2uRvfsWpZiMko6+xQ1oXcHy4JbOvIUp/Bx\n6MNjCQMtS/KvLu8VCF/9j6s3uMhvPLFDp6qkgxLY11RPqEAxvqlp0PU88J9M\n5UJ2CrtD20RDnyKO3SkVVyTLnTjjGPNVhdWb+lAh5o4vd5OUcEalU0zBC3Vb\nJ1XAAi6beKY1q0kJ5EygS0Kq5pThbQXfTFOePTsM53oqr6n0MZ6x09FOPf+O\nBzV+gIlPp2SIpTvWUFH3ZjciQ9nsX5mqihbJ78+10+88h9YrqmBZqSd15hpd\niiff\r\n=WWwA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDZDoFqZwCY7iTQD4Pox9rSdJ2LPR9FHEKiRRlQJhYWOwIgeo2kJ4bdXP4EuZIaPoO4EhxJM1acTwt/gjlyHgxVU88="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821104121_1566384295884_0.7271012111416644"},"_hasShrinkwrap":false},"0.1.29-master.20190821162911":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821162911","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190803123555","@atomist/sdm-core":"1.6.2-master.20190718103648","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^1.0.24","@atomist/sdm-pack-docker":"^2.0.3-master.20190821003654","@atomist/sdm-pack-fingerprints":"^4.0.5-master.20190821001652","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a3649af67ee73236778a0d8bc30bed35f987c350","_id":"@atomist/org-visualizer@0.1.29-master.20190821162911","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-YGmu5/O+M8AAiLQzWuK9iHwx6rMv2WO4jx9rM6LYodgwjO73MK2OZgcQCmHQGPLDsTKni+U1VEO8R47gidwqNQ==","shasum":"97339cb2dbfcfb344ab97d5310775e57aa3c5149","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821162911.tgz","fileCount":420,"unpackedSize":4415209,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXXI8CRA9TVsSAnZWagAAEioP/0NpL3tnO7Kpnq8S7x/2\niXWZiQtiESb0xy1TMnKoW2st+KYRDRuXivRGKwTocC5PAL6Rp+O3JwwL6U50\nZ72C5sbrx0kRe9QXcpQrCfTgYehVFfCojrfSiGbJ6lpaSJo+Oivmotz6xSbR\nHHJ6n1tsFm4rgByPdg86ROFd5x9vYUU0ErwHZsMNV5fw0GgFYRIHEl55c7/L\n8pLARBs5+59jffYSpCsxQ2F4Ebzv+YdEzuSua/k1vKTRpacdVItlvbaYeVJb\neVOB0/r/7jKuhLDcW4EVVzO+0NhiJI7AHc4IVaKKufxmmY4dX0U+Gh7nqrre\nIX/0YLy8M1OyWQLdsYaRlrui3cpPcpoWjhnaoXemTy7yhmLU6L2vLJvoi15B\nfYceQuyDvFGVhG2x16EIFqz5h7JoWGtTaqK4UA0B1WOhsMTy++zGQrjdF1qx\ntDWoGT1LnH0qSINERGw5Wv472LewA9pii2J5MGoxNqfvam9lHdMIptDC5TQc\nO6XclbvI9ME4IowjZcWNGB1xwIEM9f/uDMoIq9ymEGsa7QnN+BiPXLVbOjyA\nu1wM2HzlcHwnaXSnfDREyss6yKZ/Vb2VxL78A+mdiGgcwBFLd3YZluPYoGjM\n3DFBL3iu1BpYWrEpQRKMSxqWGkkLOeJkTIfd7TfYJFvEcVW5F9TCJtUz/Hqt\nlpsq\r\n=+04u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBeslp9aTYs/bKUxLHCttydz9otNHaQ3x47gOeuinu+iAiBxmjh+9S3Kj1TAE/0tTdtvN/zaL7z7LCZYwxDWoFBdGA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821162911_1566405179373_0.5914276973221306"},"_hasShrinkwrap":false},"0.1.29-master.20190821164045":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821164045","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821114832","@atomist/sdm-core":"1.6.2-master.20190821061442","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821160940","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"68b570b25a868d6fe6ed763395dcbcc10e477564","_id":"@atomist/org-visualizer@0.1.29-master.20190821164045","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-E2A+ZhDfcRDgduQ+3gkeaacVhEy/FZKchPM8s5XEkXYy+6I6i0d7yWHdG81bNT5TtmW/9qEPHoxpMvw/sxpp6w==","shasum":"b4dd703ed107208a84c2a7199b6ebe474b4a96c2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821164045.tgz","fileCount":420,"unpackedSize":4419381,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXXTbCRA9TVsSAnZWagAAtn4P/08JDIzTqNiEUuvylpbm\n8D2RH/3MZDFhYrp97NhbPv6xiFqOtZmLPamz8pE5sBq3IabfIwNkvD0eWsdu\n0dzGkY32tJmbKdByhObQcSpTNPZZiFqSefCVxCPod+NPBFZT0Va0zuH2fKzJ\nYv2TXgQfL7FVa+r+dq8BadxScGjFP+IhCSsMSQpsjpNwfNJ1/sYhkCWScpKL\n2TZGXw+/JwTUgVfmOaha7eJQJvdeZtc4/bFlvUkKMXu1YPE56tVKC9JgiMh1\nvBxhdGMRCyNaZ0vTRhxM7LJnJy2BtQ/t01CVA9FLiB1+NtjCvCUpIMZvSy7C\nO1yMgd5GseNlLATDo7E4Cnc9dY0N4nD1MsRP18a/9BmvAjPSpd1n0V1jEbCu\nEN80oAvIgNobF7bhFlFpwOTsZ4xaRdMPhur0VEV1YK36jt5UE5B3ahqwf3H4\n5492f7JKA+/WWz8e4fM9scpDRsklwEb2cYHZRilGpPFIv7QCQoP6ghI2Jx1+\nIL6Ha/KzUUvBQ1MW/uLJawCNNNZskxQdZiK6A/BlwJvn4jf9djk5b2YcyVJ4\n0CbK6J2rWHqzsa73iKmsIHV75DhTWcqyuO/gS8pJqt+VidxDb4S8mJ4vcWtT\nt4XYBYibNBeiGgnx9BGt1ITEOkamNC5/ds3DFwiQN3piOZHY6GtfMaabKlnI\nzO03\r\n=dR1R\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDI3Aosr2a12bgtEle0ZVXDlrAY1mDkkMTM88adSRuz+wIgdznYdOslMQAB1z37JgJhEvp5zdwIO3sFJj6b3US9JmA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821164045_1566405850972_0.7844344438886741"},"_hasShrinkwrap":false},"0.1.29-master.20190821171345":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821171345","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821114832","@atomist/sdm-core":"1.6.2-master.20190821061442","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821165959","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"07c852f4bcd18f11e4b793aec2098eb0d2ba3a7f","_id":"@atomist/org-visualizer@0.1.29-master.20190821171345","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-rGJvd+qsh7BjsZB4zT5wR1ZBjasnAsnbXG+tvqf6lbVuJUY6prvpyGefM0vmZMg17meYuHWUKkxWBBjdpl+hPw==","shasum":"76e453b86d0b804ac6e7cca2b4ff9b5434c2db6c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821171345.tgz","fileCount":420,"unpackedSize":4419381,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXXznCRA9TVsSAnZWagAAlNcP/3Ao3ojeeZkZ63LUivL9\n0JKTITE6j+e/dRfMVSdJ1fmVHrutV9OjvSKmo3qNIy8cmIa5mSyD5ffITOi/\nUBLRyTS3KDqYCY00T6ErzCYtlPY3DprXUkDl3GZ4T6+5H7GE2kz4J+KGazz/\neM18ZU1TxehoH51S9TaWNVcHepyZ54+UouV8ScVOI80P/JpiQnlObDf96L/s\nq/5BtJwG+iaqNvapVh6FwGuc2AhTeLwQCRGTSGBjXud5OwNpBoAzoxiLB1X6\nsIwwxgPBrZuAGc4BqecdjTkhg1doI7Dgf+YA1kFx+kHFmQsJkBVqVus2FvI6\nRyVzPpqCpVrloUS6VgFJ0bT9OUwCiSIU0gCqeN9Pi/Y/YLLrX5aeJwW2lDiL\nL8AKtDUCRjPpQ6zUA8/gaRzw3tFggmV7JFpN/OSTGnm1lF4ix7h+fBGiP1iU\nqPrFMR8SVn8xxSHm3TLliGRiKMlejjS7pc6f5Xy2qqdAQw832Q067T7nR/4E\nVOeyR80PomLPGCuHPkURZYTUuFjo2j0OnI7/rcv/x06SufyK7ewbxEMp5gk2\nFrzETDxPRnvgP/psZNLRk2mAmMrT5KgXmkjqcxb/MsvBZ973+Uhoa6RWUW1P\nEvxgIE6mayGKbBpXuk5n6zvfsMTMp0dFidj4+UFKkOZRj9QMAwLFLrzqfNCZ\npkz/\r\n=8STF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDarLYMH1ehgfG/4RRuInQwSfGeNkBbQakrQEYchFRjMwIgTpe33WLEsZdo7v1ItbzknIg5iTav3uIDdkS57daB5cI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821171345_1566407910719_0.4076587870236663"},"_hasShrinkwrap":false},"0.1.29-master.20190821172352":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821172352","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821114832","@atomist/sdm-core":"1.6.2-master.20190821061442","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821171625","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"fb971bc81b2f03a4fda01ee3900043bdc49f251d","_id":"@atomist/org-visualizer@0.1.29-master.20190821172352","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-O4Uz75AFku+9SrCq9xyUakwgS8PYzZg/vqvRzeX3UYQvnFKrKjZTKyEbsNiAk9IS83Nf1xiYC5La4pRC9jWJDA==","shasum":"f8f1a58d6e2d808a3a5583439c5555cf3e2b33db","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821172352.tgz","fileCount":420,"unpackedSize":4419381,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXX8wCRA9TVsSAnZWagAAfQwP+QAvwLVSzWSIZkmNw3BG\nstNIWTEPkommaxCLlUp1Sp69m8k4D6/C7Gfourb+UBHkZgf8LqI+0UdBqTle\nR6LXrlVzQ2wS7e5eEUqZHQf4R+c73jslGC1s8MF++8ZG/TKQhmETAc4rpar+\n+aW7x8nyF1Nb6pRfGaGSAy2CwnWYMcUqmrlrqAHwn91w23mlIxufUBhpSsAH\nRdoxgB4LrV5EINXoU1tVisVKArN+2cJREuPE3Yc9+k8YpLeZGwdDz6f2rFh4\nUvIFvAknEWtBBHrP0PUizshtoYCIFdME4Vqo3Jg5+JgCGiYefZYURSp6g2Vn\n7G6N9FSxGLJcBAF1cfQg/vhS5qF9VklE5tqYqAZjGMRbZBk1htPPR541lNjS\nFYRNdjQz2QgFI5d4iWSOXJfvtAzCiuQVtIsI+6p6vMYrdXgBx60NIKpSm8+9\nz+xjCTCXllIQ3WyaWxiZaE+M5DmVTDLWS/g6cyE03e7972IXwjjCAQSpxab/\nAhdU32nzYxujLEsCsZlHYfBdx6Ye/4ewEcHHdEkSklW8W0KPhhFZhmUumKoP\nV5wrHf02wu6HeMPAbAWY60j0gmZ1/lLffz6ZFDJJTn6DEuqrTOyzDlnQrSqB\ntVsmN+Fj1bfeJq15reMn40mUS4ZOJqRo6SLXE3rntmCXLj9J+CmxtqY/CefR\nX80r\r\n=FfVS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCHxPVT/bumSgXvnVosGDHdA0dzW8znTS6Ni80qgSSuUwIhANjuzqqWND8D54JiM/b1ebpk1/KJvgYOpcce1UP7ztJ2"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821172352_1566408495641_0.5791211170293444"},"_hasShrinkwrap":false},"0.1.29-master.20190821181012":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821181012","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821114832","@atomist/sdm-core":"1.6.2-master.20190821061442","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821171625","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7865fc4f3fc7e739adaa9cd9e4b95f39eb0b0d02","_id":"@atomist/org-visualizer@0.1.29-master.20190821181012","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-fIXO8GOfJgIshNduyUdLBo1eJZn2AIxLh/ZO6iI9//Am1qa3E8Ohm+BM2Zw6Q8gHPksP4KA0vLzYCH3LWezTPw==","shasum":"1043dce5d61ea248261562e877071ab2dc155e2a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821181012.tgz","fileCount":420,"unpackedSize":4419441,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXYnbCRA9TVsSAnZWagAAWFcQAJdl+kxKoftBPfR2hPbr\nKT6wBWSCw868w/APzQNdx1jvixsWHVRpwuH6yRh6fukGJwFroj2AKjyNtUaa\nUK9zYCTm6FIYK/5H9O66FdPN0BbHZrXCEKtzGjSJqMVBqcjX4jbCYrgNT3+Z\njy0LasrUEq0Y3reMEaQFeE6f1HiDQQLdp/TSSerqWznYGfJX7g44r7X0M9Di\n+pbP4O8gp9L56hiETI7xgRBtB4wYQ6mOGNcSpOZDx7Dlfmt1oqWTT3magoii\nbOsivrGAFjrtuR25BX0JypK4PBSx9c2Ek6s/3v5dv9f7ESuptzVhL4S3RfCU\n8s9K3vnGATQ6Q79B5adGu/de+/ii6SdzyyUL559yDYwlf8JqQTcn07e4xTSm\n4TRQf0wBjNkgcIF08IKRsKwlXx5aXxlti/zWvZwD0Gr2xKdpSeBSxeBGvS7Q\nLrBHRdKru/RG73Mbqtg+WK4IWKCTwzdDHOWk+kuTzJ6STJwaIiB/JdGDM5Tt\nUrh3nyd9gIhUGcKRdTLMVcX2VVt3MTnNJqp2y4DUfzhbFtRN0LtRYE9brch8\nAhRhrYQ3bCIVQMAj23xWZofs1FJJ4a4QnqRAuMPi3JPxIATBYRAGXtLNDtQV\nWyvsOXe0NMwMal3+08YnALWn/CrVXi38bfHFxYvWEbQ+h3dT6wYjcYyxT2zD\nurQ0\r\n=yzzY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD0mJsKrPpUiAZCG6qtfh4VSKcWjCUME4XpfYM9fFD8SgIhAIAeryj6VnWDhXV98XVyK4i7Aez76loV0r+xaYHe5Ojv"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821181012_1566411226737_0.9771102804617835"},"_hasShrinkwrap":false},"0.1.29-master.20190821191911":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821191911","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821114832","@atomist/sdm-core":"1.6.2-master.20190821061442","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.0-master.20190821115251","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821171625","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"306f88c80ad9b655b6bd53cade190d6a832b46d5","_id":"@atomist/org-visualizer@0.1.29-master.20190821191911","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-O5sZZw+NUVEu2vqc2m3WsdwxjgxnH/qZVfV93DaiWtnYwFUgfnZAV+/GIHWD3KYZUsug63KmMWlE4s8LAegDTg==","shasum":"2cdab81f2c478964e27ae035319d21768c49e4ef","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821191911.tgz","fileCount":420,"unpackedSize":4420376,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXZpfCRA9TVsSAnZWagAAI58P/3G2Jm3HRCuLbo3RLSkA\n/jZR+x6RtQJFyzszOr9m67Fqc9Ef8jiCAnD8qToBF+1yJ8KoV39TWVSQ+YU4\n0lqoPdqhwGUPNkCWVN/pknkJFAtRyImLFUwr+FKyzEMaNcGVOX1iuRwW1Q0O\nySlCj377MicblmChFojKAxRR1JnPpMu3w2657W2WPnolWHPSqDctP1QXgnz/\nyqE7YHxIJ7Zgi4cKdCTqTGG6EDXbrS6xCXuli00U7ivQbEw5itxuJOGmVeYa\nW5bXdI67mf1gaJWnu46oSFc29tPoI4t0y2plHkXJg1pZ5uwUGjETAF97VZKn\nblRiuoaygL7+YzkpSWGoT63rnU/Smd9omcY94OWbGFtrBmH6L20PdAkc29Yv\nY1KBf5K4/ssTkUf56ohYkKaNOGx4xr/H2dA0TYIb1X3Hb0dWBD2CvtQaKkIM\n4TiGCXcvAF6glZWniq2wbvqxIkORsswp/x9tXYGx93vF1sbJh/mDKYMiwmkD\nj4R1JvlxSLpvEGM8xksC5XPNvFybzdqcyKiHZVQxdLit5iag2eDCNYvi8CxK\n1XihJkbi5epcVzcbMCRLVgVJ9Jd+z689QVSngQrZREDPRnkIymM0K3Oqzf3u\nvqo99VFo9g2ksT9T0i2Srnbhnpr16Cj35VQ7H25pdk6tM2cP6wHmPUpHsEKP\ni5EC\r\n=gThx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCdyUDW+6CSz+klmGrV0WDBV3tG8s+q3Z8hLN6W28GIiwIhANMBUsr/xHmNDcc71zPI+bvv6hwD52qxWH0uCLW3WsuC"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821191911_1566415454583_0.6882255546548699"},"_hasShrinkwrap":false},"0.1.29-master.20190821203056":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821203056","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821200521","@atomist/sdm-core":"1.6.2-master.20190821061442","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.0-master.20190821115251","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821201638","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b954ac38f92c419254413b7b497c5b4a374280b9","_id":"@atomist/org-visualizer@0.1.29-master.20190821203056","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Abn4Cw422mpn/7IsXlKYNzf4Xo4dLJnqhxQcHNl9rcCyVorIefsUl0VlDZCPe8kzYnWRhZnLjzH+LbwHWe4OdQ==","shasum":"e070560fa07305c0c1f315fff04819e826fdfdb8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821203056.tgz","fileCount":420,"unpackedSize":4420376,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXaszCRA9TVsSAnZWagAAxN4P/0u4SA1sNxaOh6tg8pez\n3I77sWq7A34IzMWbQZdeWmsVu3PK8+Lk6X5Jb46UtrQnPOeNhNicejJK0n2a\ny6bS/JLxC6xYaVM4UZS4WKDnvy2xtqi2K0s6Zw0gygxoKzEnQeaXnSL+HF8v\nzSxpwMlvroyw0MJF0LRNEpZUjitTx8Kb9FZ9IcO3+l5sxtifSKMxmHfLMHXk\n8uT3as5PEGM/D6FmjUbQW/V78AkhZ3P92qeNdViqcyeEuiI85xOBkcPOiw+6\n7EuYRjsxQPPy5bKCgEdOaKEebNKaTZ9tN/9i2jGJ5HeOFej9OuEEIkPYqmLK\nN5+1LYqVOWDpRQSM3SvDcv8T1SJoYdKhc6Y3i46Xjnc5kC9XYnOEDuox32NE\n3m8GzDo8/3WeaI8+40YUh3Ybk790+403xyg7ES9x0BHiwIjxI2zHMF9diRxI\natOY6fKd1tozFYEoGkqeC8WRADQM7QFJlQaWBasoqyaaQTWM2N0N4oM9LLvG\nxs+SL5i9agJAypvJ4CN81VCmRAII2FkGR4y7D3ElIM/RS8/c25LJ4QbXjWCM\nIjXGpdcngdQt82hrhfXPvK3wOjFJjVgeUZwHdLrv5VevT/sJlO+hFlM4eX4E\nWqsCpkNoThnOSWstLRAcabf1s9qlWjLreTAz0e/aKBgI4ePvyApoTJc1KqMI\nGojK\r\n=6pNw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF3W0IVTg1pzDeNOUlIN5qVrvpShpm0q1o346PaY39gWAiEA+MvJyyFf1bEGGHDVxUpPLcqYrhJSjKegKQzFsx0cn40="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821203056_1566419763009_0.42896954041032687"},"_hasShrinkwrap":false},"0.1.29-master.20190821223506":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821223506","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190821222719","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821201638","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"fb36be479e0d32481fa246a45f592e842d7c3849","_id":"@atomist/org-visualizer@0.1.29-master.20190821223506","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Jwgb4X8WnO3lDzM6c/bM33lqZlZC9YcPJajM5WHnIM8gx+F7hJlmOb2RP6Pc6Fp59cwNOow6OGay20xHh0+2XQ==","shasum":"5d175495fafa0c0cc515dab02da7e9dcd145e49b","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821223506.tgz","fileCount":420,"unpackedSize":4420333,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXcfmCRA9TVsSAnZWagAArRAQAKKiCzkY0cJNCloh5Ygn\n13iUEsohL9u5jhqiZL+zx2ZXGgtDP1G2/X9TrPlJ/SbGPQUuwCCdSLP+YtJI\nXdufzNYfhVdQDU1mCRnxD68ojue5X4JW3+4/Fkb1HZp1Cq22hCzkelaYgdRP\nCVcaI5uv1iVbFe4rH2O8aucvSNH8d0qR5siY6Gtusat7ZMTzldIfKJk1jrzS\nj96jUE9tJQ16Qyb9dVINyqpSA1wYmypeL+yH72KuU+J5WFMxR4G9He3u8Mht\nmJp+eu4qYPJJ5ppZmA3L2kNk4g5C6AuaQiEgpRj5VDM2UoSUK5fsMQgyi7FI\nHeU64mOEHJIP9dSBU9dojXoVfL5/73LP05RxDMAt4KrSOGfMg0jRtmp15PaB\n2JR885zRB7Zf570pcJcIlttJr43282jgUWRCY8TMR7q847MpXpPIIW2CBQtt\n8GdfYm+j3ljzC6jXG1PN1QjVDvuq+EOUPX0+ENCYcxg0tqPK/Ya2mm6pswwO\nkstjVnfeFmvyU2sTl3CnH5jSPq+eZTiBGD1dQIa18bOzrIwAyZzigtUoTcyn\nwwclzWlM+whGwmovlXjLvrc74vN55G/kCw6+OACK3hGuQY9fkgYH7kYzQFf4\nOKI4zqR5pOn3mrOCiCfYuoFwN0+yqavtJnNR0TD0INiL5LqD4H+7Nb2aFkqC\nWhXz\r\n=iEYs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICy9ewjjOdB0Deo5hXq9bwmf27ujpQy6y4GbBgJXDFcnAiEAjBdU0mevux2x9I1fDDeR2McOqAfw+fFZPpGkchwszzw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821223506_1566427109952_0.5662349758626022"},"_hasShrinkwrap":false},"0.1.29-master.20190821224029":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821224029","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190821222719","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821201638","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"dd903a5c4bac928a1aadd8a431ce80fb028a7dc8","_id":"@atomist/org-visualizer@0.1.29-master.20190821224029","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-0dEkF0SiyeSnEXTV9sZz5zOmc4Gl6YA6pLa4i9OFVFCJF66gs8VgoZ1Rg8dnEylQGt6Ru7krFGr6tahqxhRA2A==","shasum":"a96857059b0924d2e2e7e8d8d29fa43c1fb87ccc","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821224029.tgz","fileCount":420,"unpackedSize":4420333,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXcmOCRA9TVsSAnZWagAAVHIP/1d8eMVKhCr19C170vK+\nvEXwxEjcRtWpT3u+30xkBel8WfI/BRNM8OohjfyV/W8vK55sc0JgYh1xpwu7\nBSQ6yR9npoLO8gFquWIdSsWEe3CX40vK2yOQYwhhopFZkFaIxKSAGZKx4Ave\njALzsvpCUPLesqgws946IZfM3w7+/2S/NkAqgAwd3Q0wnx1y7smz9MMlcy5O\nQEn6skfOk8ZTgKbIl9BUXU/mkQ98b8x9gTupVjnIrPwA5CdrwHUXr9ptWrX7\nU/CFKHk4k9+kLXsiSmYC4Hq0vaEKe2q1QtT/yaL+DyChgnlywv4RgAMsZSr0\ndbR3lV6BQ2iGh2RKBeeAXUdX4e3b4P1Y8LRDNUbQx5N4WwgdJNmIuV2t4t6E\nVHw1YGrbvLltLTex4n/fjdM/Cn7uPgh97QgFeeFbYXILeie2Q5B7q0IngsDc\nnxQdNHvoeMepCmZ+C0VNrBkig6kqXN8tgYuID49XlBPMc7FQmFx5gLsblAgo\n9V252X3uR95LWdiLAqoYY3GnkTWWQ5gmtgwOPG79aMl5L+UmmgCrZBRXAn6d\nAF73jR64FalVyPLOdLzGf8LjhWhVt7ImSeh7WDU4VxrsP9z3qfuDfHPB+rEo\nUR/m0S8wIzeinF/eQxIVk3/dpKQBm1LREh1GKiRbUXdTajbDK8Mo5ROjtNWJ\nZ/+c\r\n=rfHO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID9rzXV7ERx5Xgr7oF30zP0t+1fnZ8j/BC+wxmpNe8PwAiEA4NVBsE0cz8DUAMriI2nViXfiTQL2N5yYxYwFMiu3c68="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821224029_1566427534023_0.8042917257392364"},"_hasShrinkwrap":false},"0.1.29-master.20190821230931":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821230931","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190821222719","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821201638","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4077a6eb289498128db450743ea8966ba6f404ce","_id":"@atomist/org-visualizer@0.1.29-master.20190821230931","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-qKZIAe0oaiYyyq529T8pJc4bLhORPtW9kwNgUVEbqph6TPBLFo5SkLOOZ/dLer3wwb35jYZxDzXUo3FKqfeTVQ==","shasum":"b45eda2dafbfd4cf0855a018e20a55edc77a4aa3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821230931.tgz","fileCount":420,"unpackedSize":4420293,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXc//CRA9TVsSAnZWagAAdnEP/A5Ig5uJy/Z7oG2XhuIw\nGO8PYgk72L28pg4i8wzV2NbF7k+D6/jroTmd4pvW6+RVDy+qXReWb8ugynxX\n2PyPp3aD61cViFtpQYrKqYgKBN21b3csfA/NSQRcCvtBzU0R8VD8HMd1nTwA\nHpTVIE7AoecJUnQZJJEeEpJK/rXvotC1MRU1VTWxrScRsjhUbNZtjPo4uJYY\n9R4hUCxGziMPZSvPrM/i7x6b5quspf0QrfsYtuAHorz6UcrVbR/ahxpCGgOA\nJnF3DPvD0FnsbK+oSX5EjS+6bb/WLHJig/7cPRYqQn5HUKKYXZBYk2auMNLc\nakK1S7GksAKyllP29xvu+H0x7y/87NwEBbv0Q7lctKwKdQTwjdrw3cd8mXh3\nQFZ/KZROUImqQL+6fhh02m/6cMPQykcZTK+WsUCsfKersPzkUXyuQN+IDcky\n8628yAm8L1CBJ9QtSrdlej217Pj9h7z7yE+livwZA6DPbMJhUSwzJAbybMfo\nuF8eZnoA7A+dE7WJfLtdRAixY+MGQGOjU23n+K2WPbS3RVKOAcGw+4dhhO+q\nePalC1tgSXX4aCRlI5bAg1RFGTbiveNcdypme2Ly0D6Z8vZaYNydkdCU3f4G\nATLkZVk+XqR9Pt/+z96CwpogmBP8pPoRVo/kqpyIO/hvkWC3zIVCLnO+Pv2j\nYY8k\r\n=wrSu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGGgQdDEd1J6/uqZPIRRHiNU+nxbewCS8jb/j4zNOj0aAiBgRvdbaQkg09OgFh2K5dNSRwfMucxnqykhYXMqhCTz1w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821230931_1566429182520_0.43335984195992605"},"_hasShrinkwrap":false},"0.1.29-master.20190821231037":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821231037","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190821222719","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821201638","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4077a6eb289498128db450743ea8966ba6f404ce","_id":"@atomist/org-visualizer@0.1.29-master.20190821231037","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-MknZQG7QebDvSQChwZEFSXw4xz5+/S4K1eM/PpI7wnHs5UsSrWyavsaluTi6lmleeU19sHFbodw88s3/Qg9wnA==","shasum":"88718ed3fcc9480f972467aa9cdbe80c4986471e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821231037.tgz","fileCount":420,"unpackedSize":4420293,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXdCTCRA9TVsSAnZWagAAOPYP/ineALIw8UOccNP441SB\nIBBgRObELKdhD3jFnz64viUPMTDPvF4W6LU96HPk4L1LgEEmLjiPCZldJ2yF\nG6DafSGjMbAFDH+W/8Dm6Ai5pho/JOhLvjCh3PKAp5a2QrMFz6cnURYjWk4L\nie8y43f54A2EvQErNu+sYObWNX8PsDLmX44m1rYubyzCVGjZiQOIXeRWLZPZ\nec9Fg3kLZrHi5vq4acZjkvq3HPgcXjMMXZSktdYU0Uz06kO6T0TN5zvChjS+\nXwd/3L6gJWJbO+8cRelFTe16B9rVXxT/4eHHpZMBxBznLRALkHdzW8xYs29R\nPqP0iHAC2yAbeXBqBZkZiTnHroZIJOoEgrEOk4GXHrdAs+hq5iZxXeZ4ytDL\n7x+S7NCVyxcHNeznWA2ErY6zZcq21D1mAnfD2K0XcC3Xtado6DsUf4UN1FHl\nafrxhClrXP9teQkNSF24QMp2dSXslSC97Bw3BudR80BY27QzPc+5zhGZRAGQ\nh69qjYB4H8vDY2PDr3ZB1S2Ka6SYd7ccvorUyl4vYaLvjnPvz2PVKbMrD3RI\nIcSn6V/BZCsqtJWPoPkknbCtrZpcGsKqc5R1roSfQ+WukxMbtpxMR9a7THJ0\nNXOws9LKb/cg+CFM9lo7eUDobMBqHuPs6WoNXYcRrfp7BFlZF3l5BvVkPNm6\nGqg4\r\n=LRDm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCIgZJV6q07L9IUMbi4eNgPxbe8DCVgfyhCq3MYAD0MswIgfAJBYFQUg92JuX3ZuWCui9wEm5N0OAKQeTUdTp3gF4Y="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821231037_1566429331246_0.0978138620939899"},"_hasShrinkwrap":false},"0.1.29-master.20190821232139":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821232139","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190821222719","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821201638","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d45de1f24a4b61ef8ee86315d9f7a5339e1ba856","_id":"@atomist/org-visualizer@0.1.29-master.20190821232139","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-y8fk2PmqhPEUSh+J8GrVEnRvANPW7XVmEoelq8rk++6PsSv56Ar3XAQZV2MdtmnqOslUM39OoWNYI0s0DMTFQQ==","shasum":"a72e8a029a4800b8e5afa446a4aebef24a364d3f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821232139.tgz","fileCount":420,"unpackedSize":4420289,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXdMxCRA9TVsSAnZWagAArDgP/0DCA8CFPlOuSvsqYlMd\n/0X+Mbn5aH/cOyw6C7budq7nK9aX4V6cc9sJyUgF5cuRqHwf45Anzdqdn/Xh\nvySKH3cHmQhipzvrWyZzlJo+pDc54T6mWwy8uzAFd6xWzIONqhhqbeO07kBh\nNR+KMaLvMP/hTPu6gYuGydtT0BsIrTtcNQLig11xhRLTA3pq0z5EFS+e3dIi\nTqPnygZ/sntilMUkRUeLthANNtXDJjWLEim5uF/bisS7+xbOWTWkR2acI90V\ndvgeZlUX4H0kcUYgJInlGbT2fAdLKM/2pZkiCN7M2oOQOzlwvdVg+1McibSE\nxAriUNnkOjsGSq4TFa3lWCyBbwI8G6sqlwizXJWULUh87yx6uCbj3WROP6h9\nhKykVVCXvsdpH2nDBDEiN7FN/Hw3vG6iKOD66ZRi0ceXKoB2BFC4Q99+scj7\nZ5Gyzqjof1afiIYsrpIiR1G8RCb1I8Vos9L/UjHTT5el8TXf9NDxEK7xjmZI\nkafcewWUDSgJPtDdoVPE5any8Fy44STuRVuZiX9wrISWN1Nbi3SUrT5ug/VW\nHacckuwgsxxA6yr4R8qLHvfpsFeiA6w37PuABzIEy2kn7acI+S1qMxZZSO4O\n1v4fpqnr86uKjiIXQRrJHp2f/0GAYpiCU+YwESqdzmBzVUL/6H/bAe7dwBV6\nRVm2\r\n=Xihw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB+nyvjqoy8+0MfqlViSqVXWLlWMrnUsDNPyH6Z6oVpOAiAzVFVDCQ4UuzlPJdCLrCYBjk2BZi3w18IpeNlDM/jDfw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821232139_1566430000641_0.32282713735753243"},"_hasShrinkwrap":false},"0.1.29-jess-tsAspect.20190821232816":{"name":"@atomist/org-visualizer","version":"0.1.29-jess-tsAspect.20190821232816","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821114832","@atomist/sdm-core":"1.6.2-master.20190821061442","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821171625","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"7c4013f80688bc6d10db4c24354ec51a2e9d70bd","_id":"@atomist/org-visualizer@0.1.29-jess-tsAspect.20190821232816","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-a6G65BnTMyGyZYdIeOGYVr71o5yopMivht5vjgC6ACOn/470JBi/cZjxV/SJrMFJwFcWSuTYhxr5c6gGr99m+A==","shasum":"218343521686d5b4bfb0bda25347838cc9aa87d2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-jess-tsAspect.20190821232816.tgz","fileCount":428,"unpackedSize":4432766,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXdRiCRA9TVsSAnZWagAAb9wQAJpzdLM8vNzjUu1xRbSl\n1vHxocsJFM88msJiDX3ZQs5PocaepS7z5AjSBwoGrN0Gld/CYx5N17CEJIW0\nTWv7h1BPhxpzV5r5KT9jZsnHaMiVETshErwCDY6GaZf0+hihYYmJ7bV9RcEB\n0YKhMoM5daBgNd61EnSq0rTe2/mBb/phHll1Q/CR5ZzUwkyu1GjGTdsw4+9O\nnV5+c6wU9YOv2SIiPXO4/YxVnpoDH/aAcCSufP2BIiLLmAfCufSfxT05iyD6\n9iHDV9U2kpXY/sSfcQt/VMz8NFBdnPp9quwP7jTFvzPFaV4KCvVX57KFug5O\n/d6DktbGAg1+WEPj6sU1KwsBjeYF83Q8YL1EU0uD1333bp/w8Dfly5B2Gx/p\npZajEvEvDYEgihZwJ7LssPvb/OV9CNABxyJdPncNGs/5mIkpc1gwaybd+9A1\nHZUARVVhUvM8WmPbsBfJVvQoEWLldTxkHT2UNtPN0wdpDc7gM7EIPxVcodCG\nT1il5GgoI5j8tPt+dj95nE70DM00CILJI+0fDwQQ7L7wVEvm2ZBimlhM/PNA\n9H9oSQIqDBlTEOxPOZTFD4QGSMdALjxIVI+CbbirniFZsdC8tFfldht9Ohyu\n+y3l3P9bdexip7acmTQrMQNkBkR1PZv+JJx6YdnS84/iZIkda0LceczcCrLu\ncaZr\r\n=vuCk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDlgC8JRYk2FpEqmq6H7rYPKr715g43oALu1AFq8y48TAiEAhtcqD7RwLBExViCydx9Kmps9v00ZL6ZQMubpcyTuAA4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-jess-tsAspect.20190821232816_1566430305729_0.838371144952399"},"_hasShrinkwrap":false},"0.1.29-master.20190821234858":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190821234858","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190821222719","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821201638","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"8661f06127766d05f29a727a6392eb5d9b0b0f6a","_id":"@atomist/org-visualizer@0.1.29-master.20190821234858","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Sg42FB3Kug7971RI1fAufLgnBZonzCxvPPNdtX0oFXgJq3DlFIKfYfoWNDJ4doQxDhgQw64QbbwP1M6esUKLYQ==","shasum":"c8baf8eebd6cd006d603d7b16730ac7df2293d87","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190821234858.tgz","fileCount":420,"unpackedSize":4420316,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXdmyCRA9TVsSAnZWagAANB0QAIsFyrJC1tHqjMU8hBRP\nz7Ub33jNRDAxE3hlxAMhOcW/5pw5BmhDTcF/cF9jCCKlzn+QvQ03LNM/o4jE\neFWfKozYdhjwCzKdPdTbhOO2PH2KIP1p0lELmRbu+NkSB3Z0trHTjXfiNH+T\nE3TcIZZ6hYpC/Whwd3fF9nUNFuIn1CC/l/MxEOt2/3acejgJ4psTneC6j3Qm\n8DBEuGZoLmQ/aDEmjrz8iWkg4g+1THtRXVFwttZhWgTHVDpmHJCx3Q6qQV+p\n30AJ8RN37KwqgQn8+Rt0AKGfwVS4UEmZuky4NCwn8In6AG6ivDpT+kpbhaD2\nSNZDW9PUBXPfLJvPfndi6cUMdJJnl/7y0dmza3KTRtzmtYbOrCflAPJyMsiR\nCIcUZeNGfpmTaMxH2cG+Rh2Oxiny/Mn5pimw/9crlSyt8erVGmrBoZTfMXvV\nFL/TiWHpo3nKCICP1Xg93ipYjcK+luGItT5eYREuIOjwUVppmFSurmwvVSF+\n/Q18UGorHPxRPoCUSYDGygEHhUtdjhoJMwfBMFQkpkHDAz9WT77EGGAueyLY\nhGP85nsRtEMCH8UkVDZWpfxcMlqHVm5HPckZd0viVhBaa1b3kVv6inyY8jV+\nLK51FW1NgTOU1lcBozuSv68f8c85DCiTtXMmQDSsrzHAmovvnvTuPDjn5wYh\nN79w\r\n=wpAE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCn6RyxKFXfa9S3cZoDXRSk8vYl0q2VRv1rK974QKSclgIhAPjF35RM6bx5lx2dFR+sBXCjUQ1JWjhSBUxVGBJkCCgP"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190821234858_1566431665614_0.15722236617122798"},"_hasShrinkwrap":false},"0.1.29-jess-tsAspect.20190822010814":{"name":"@atomist/org-visualizer","version":"0.1.29-jess-tsAspect.20190822010814","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821114832","@atomist/sdm-core":"1.6.2-master.20190821061442","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821171625","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c4fbea89c56d9346acfbadcbc6d0e21d0a53f536","_id":"@atomist/org-visualizer@0.1.29-jess-tsAspect.20190822010814","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-1zavhgqMsXsylta/K4kl3Ae+shIcG/W8isdtDK5d5TT4hXqf0/B5o4tZ3sVkFTyuVjQINrV+gf52B+rK5rEQeQ==","shasum":"dfabd36cbb800f5df4408511dfcac4b9aac00a76","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-jess-tsAspect.20190822010814.tgz","fileCount":428,"unpackedSize":4432766,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXevUCRA9TVsSAnZWagAAIQ0QAIIrm7emLDhwGCs7hUcR\n/CPFYXbDtG7OWLmB2WUDZgTTQ1InAcEF62oMkvO1L8UxyOzAT0P3gIGZWhLK\ntfSS3vM52KV8hkF0lP9gBfEhABykc4WUMKy/QziPcyXwY/gx/I2X2VBmctqy\nb56ZgCbNEZb+8LpRexI2ZzAuK7BggbvTbslo487WZnhSIlMfEqCw0DTyTo66\nvcUWlQ/9GmY+pjZ9wUN05wEUCGjuintaYS7WpkvqHQE6Qdnxi3pNNMiMFrGE\n+PIEriihwVOQTLgPuHcbW/i7fH28zbU13ZRQtUr97WbvWXHU8qf/yTQSDOAx\nxZag5EMlCfhoYRKbNVJzDze16ZmYpHGN3RoyY5KSoDJxkBjikOmpzQRd+150\n1bAehvXSLDWq9h4D0bLbHyeoXZgBaZ3TbdiqmxU/YXVGqbRFNHK1jCG/gRtq\nMsYhi+bHNBvoeohmU8aMJL+joETChhWqvsCOCvJ1rHAi0e1FUdnOQI/HvlCT\nMI2J/rNjTOq+fH3q+53sO9Ir9xYxXhL+XIHBXA8n3tJQ9iOyubDtRhZ6F3nT\n0fK7/+3LCxdiicn1dgoG0woGGPA5w0UhnAPqRs0bUkdOjf46wJraqM+ccZfi\ntZmk4w1Mc657lssYdwgMG2E784oo1MwEWZuu+lKO8sdf1g4vono3cIG3GbnS\nmiOq\r\n=362z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC9X7m9LY/E7zBrxtd03eylN+hOBxlM9NHEkto4hMrHxgIgSMVSWzeTyMzh9AJeF3RBnXdhDN91skzjuQulG0aOjY4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-jess-tsAspect.20190822010814_1566436307899_0.26564968248511067"},"_hasShrinkwrap":false},"0.1.29-master.20190822012608":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190822012608","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190821234002","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822000651","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ce0c59516e1bf080cab4c5f122a504e26e9d428c","_id":"@atomist/org-visualizer@0.1.29-master.20190822012608","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-UURETgFnR7csz5NfW/krbpRmN13j9m7FW2WGEmvL6l3s+lAzHQ1rNfpHmvNmYXrE1Pw4NiGdW8kPDQR0st/rGA==","shasum":"a71975327bcf6321abb801e402fc8158a4466832","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190822012608.tgz","fileCount":420,"unpackedSize":4422421,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXfAyCRA9TVsSAnZWagAA+nkP/07MIxm+w7+t0bPhjeuP\nHTbT/XbP8ns3kQtVcn7iyMx5FYx8YXdNPzq459Vj6Tv7S+Y5TUli3gVj6XeR\nhdw5lxHVFnGnkBlfQB3s9cBowfTTHYTltwT483Xsaeyx87tKIqeyTMCgnzFV\nrmkrOzxHVp58qidLkHeeJf+/LHD3b8yWQsR5fBBkyzc/UatGDteZrVyWI+e7\nzz9zSjS6pvfsGk5lw5Q/2vki+7gybCrFz0KtvUCb0gK5plghyeNwuhJGdRBr\nklZ0wmTOSRffsoxfqRzhHIeySgEg/1IJyHGwOVh2m0sUQQpIdBlELbfXW6CR\nXsDMfwr9FTagsw/pGJ3138af1pSuGXgnmn2z/TzE/aeM+eskiFEJsL6iXj6K\njL5/AlZEN4VUnkQEoXJ6dS4yrgNMe3RyovPhOUoyexTlnDoZUeM6CQO9RBvX\nv5lyxBAyRCKTTgY567h1kPh19uYtKD11hUSW0UjdM9s3zpp4+ueP/6fLW3F4\nHS1fhHlwhp+by/XeKhBJ+O+J4CgcDq4W5Afzkv0Uxo792Z7NONy6R+lOkdYx\nUt10lc5EzKprIfciv9CK8nTXkFtuPe5pqVkJ2ObzAnvPPeFeJYi8lXdnScHs\nCdum6zXZ/kJ3nA/52F4YC6aRpxYTehcnQJ8XHFviejiPQagZZ1eCnUTkLdIJ\nsJxr\r\n=ucpF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA+MPrYO+Y+SG5hp6xARqDTOKjX3FhJ+BsBSN7MJWfmyAiEAm043LYzLVapS8LPZrsckZIjABnJuYpkZp1q6stDPkW0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190822012608_1566437426110_0.7844778857940105"},"_hasShrinkwrap":false},"0.1.29-master.20190822084137":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190822084137","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"166719ad6d7eacbc44be2973d25bc86ee4cba1ef","_id":"@atomist/org-visualizer@0.1.29-master.20190822084137","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Djw4VwCTv8rVoxSRxpC1ZeHsRO48ocKSW+zV/caaEH/P/M0gFVGf/3ZBm1D4vEVXY7/NzlPyXBBwqI5ulyPT2A==","shasum":"4249b9e70c81ee37551e79f0a0bd362035e7bb1f","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190822084137.tgz","fileCount":425,"unpackedSize":4428735,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXlY4CRA9TVsSAnZWagAAT2AP/1Masn6uxH9VkQjhjo9o\nrZe08hdBq21PlSy1K6UCSxTm6p9l5ashY+LMophlRBk2Faerjw4ubqpbhs/1\nHyKSrpWOgW+PMAVMv8Uq4S9NBwi71QyVbYMx57DrEHqniuKoh+MiDyaFgOK8\nNXekvFrD1zUHgQhXc381U+NasRjancPyyJMM9jXGiIruPtdGv+VvFaF7Si1z\nSeoReZZAzAijnDTnBiNuv/xbVOfJFpKNourJyw1OuoJFSAxkhWaarsfusfUt\n3dAi5rTJ94EnSpil7yaoE2efy9bNjWwxNR0LKxVMMxKLBxqF1vIDSYbAPnTh\nz2WyMZ1v/n0HOs3tt5sdJtfeNqbv9Kaj2pXVmT2beS1A1+OEJ2OW/I4V5e/T\n9aMe4h6aHpUufwpnhkujuVM687VUR2P+MS51b3SERxCyLlXaCMQSQACo/zvd\na2aJalUQZfdWes//Nobny2CbafBAJunAe3f3acUJ5T7CSPeSy+TP54UTvObY\ng0TWzcopirZQtqqfmqOTlChkRZh3NTImFT9AfkAh/K4SS26fhevef0hfThCR\nm64GGw/yd4tipmZ0KRIdOkZhrIcczc6eXx2vWWNBkVwOSS0M6ApVLRvdgBTC\nMY2eXzQFpV0WnBpHiooMeqxZaYCVJljlmwWBIKDA8BseEPlQeMlHTZsJiwm1\nApkQ\r\n=q5FU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIArASmYf6sWInhO6kirydAMUxfkUGQ0vPWzhOKXCPD++AiEAq6YJR+jjAQhFLV5I6uoG01StwtdbvDyaH59Co/UGe1s="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190822084137_1566463543896_0.9264149909233794"},"_hasShrinkwrap":false},"0.2.0-org-visualizer.20190822112609":{"name":"@atomist/org-visualizer","version":"0.2.0-org-visualizer.20190822112609","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-drift":"0.1.0-master.20190821065818","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"13e2721ded51ea2a95fe3f6afe95cf95352eacd6","_id":"@atomist/org-visualizer@0.2.0-org-visualizer.20190822112609","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-o7uqddfh6U6z+1B0e3tGtiOLaEaaAfTz+K338keV13+C12WMxBYlgHX8k2+sFoKeLylIgwvI9DL8SDFlpE/5Fw==","shasum":"bb71625afa3969c4528373db8b5572c62cce93ca","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.2.0-org-visualizer.20190822112609.tgz","fileCount":100,"unpackedSize":720834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXnzMCRA9TVsSAnZWagAA0k4P/jqnOBh4Y5ma3cB5B6Y0\nLIkfibHtU8uaaGtdjmHCU4cHGWkEHGOr7YKl9GqobsbYbA/AR6cI2idA5+fT\nxSlbp8wN4tJWJ1ApCpUQrW4iLt8KwXZWVfZlMmQln+Mf6HcezFKaSsC2IL7z\n5qUUY+JyljPuIUNje1u+K9Lp9p+HRg0Wz3mnN0IcxJJ2eZjvk+GaF14EFysQ\nN738KDu8AmZWtQevlwusp+gZh4DEuodMF1cMQZ9GdnSgEOlnbqAOyoJew2Zl\ni57r19G4EaTuoZpAYS/tqEBZh4w3/3ATfnQGE46UNVRVniexknbGl4y00LXu\nNxiUcozvXNyZG3tSXHtQw8mzDzC3ukq626rI2sW/Dh//D1zBRO/Xb1OQL3hG\n3Nm2Y0JwLX8VC5KWkTGU3bj6RNU+Y7eEkLJi5zDMOirfa7ECnjav/KXxkSNV\nRrlWK7J1q2+v9LpBH3YFcXOyp72JvERopvok2jfhoo+n0kfELQOdADEfHl8Z\nCylwe7qLqjnRSVn4+z9JMsURcEunfTkpkeh45JOCR5VJh3n0tKy9mIX2eX0k\n/8+voJ4arc7+pquyn1LZvgiSt43HZWpdXObFZbE8KkCiXE6GgQbcDbR0qQEo\nNkc0PTmK1bXhyTWuKFe8JUoHtENajOhJydMo7BswKxhVG1UH4DGfg2cXKj0m\nzLnp\r\n=YtUZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDBIQCqTkA6/tRnM3rZyav4yGM+q+3ELQ91/NLMjKVbtgIgOHMg0ztCNW5SmyFvfWrvcuc6EklP6XxkYv/6vtRX0Oo="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.2.0-org-visualizer.20190822112609_1566473419654_0.7340072280351564"},"_hasShrinkwrap":false},"0.2.0-org-visualizer.20190822115005":{"name":"@atomist/org-visualizer","version":"0.2.0-org-visualizer.20190822115005","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-drift":"0.1.0-master.20190821065818-sdm-pack-drift.20190822113235","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"845e864fe7c37f8568bde97c66796ba2bb26cacf","_id":"@atomist/org-visualizer@0.2.0-org-visualizer.20190822115005","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-y1pVw5stwOIslg25SQdNgy/vtpUwaX4teIpeVt9I+Gb8kOxX87p/Evq6eUb2StMvC/fJSgVqQx5IO2NgtzLauw==","shasum":"12ec42dda0d942bf39ad986b03b9fa5ccbb3b958","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.2.0-org-visualizer.20190822115005.tgz","fileCount":95,"unpackedSize":704639,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXoJ9CRA9TVsSAnZWagAA07gP/RwTMbPvXiXCDE9QK3VN\n/rrQ7jScpOl1lnLBzwxhcXIe4Mx7t9BP4QeK9Er9pSs2Tnqyk+UCPC646HAV\nqIZBxYVXxO9UqXwEYIJ2gOG1JcCDwcV+mQJPYL3lbDBDJpa/cvTKLea9hLQG\n422p5VmGipBVo+RuGCq3eoLUrPQvPbsdnlFDTbVxzpSIXnILH56o73+IZxex\nL9T0L+WjGsSMCrnvHXvRcdDGUiDbbGDTVJ6ynvBU5vZWZqlIR8xtsiaTgvxf\nk1qDRLiPTIUQVyEFkJEo6vGbT9jRY+prBE4fRviDdlPt9sDYpviNV77Dy9l7\nSDslGr2KDyLw24NtTFedm25ihUGvlMYhKdUCwEvI7CWKWYEjB1SnmRKHC3vv\nINQ/Oyt95cIeUR6+mIg0QozkI2QFI8EjpAZK77aC5X/ho4uUr1SHEVAw+Aki\nfxj48ouABj2hrvURFxje+NQX9dCm02Qq0uukBM0kGWNdzRriGESbFle9MCy8\nyDVU4UtVA6kpBStwXGKlr3Pvpsp0RB7HCRUCXgcrZ5Qruxx7ndp6cLO+CKdi\nZlDY4HifEsNgP6QVNqiy0nKZppmsjfzltmUa1BAa/pQeyslhnJixXJTuHR4p\nTfe4E/2ds/wz5YJ4uCGxjoh9MXOqlP/DyvRzUPsloOaQpI3cMFV/fM/rw05x\nUee+\r\n=MXzJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHW2BorLontp4DjKHPoehwSZ+oandYvA/79za6ZHpbYQIhAJ5cNHr+QM4rD4q+AE7lpalaS3fWR9vbdblv79J6XZEl"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.2.0-org-visualizer.20190822115005_1566474876959_0.009548614440836323"},"_hasShrinkwrap":false},"0.2.0-sdm-pack-drift.20190822120156":{"name":"@atomist/org-visualizer","version":"0.2.0-sdm-pack-drift.20190822120156","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-drift":"0.1.0-master.20190821065818-sdm-pack-drift.20190822113235","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"542f42bafd839b67dd6b3eea76d47702ef808816","_id":"@atomist/org-visualizer@0.2.0-sdm-pack-drift.20190822120156","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-VaCFwWUttZ3npz39QYNvhx+4windrKCV5bcVvZIsTVQm/40KLqrsApdfm1GWBnPhvuB0Dc7FDHL+BqN2O3rZRQ==","shasum":"3114a3538162f77f4da55fa8a0d8ea4cbd8fbc00","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.2.0-sdm-pack-drift.20190822120156.tgz","fileCount":95,"unpackedSize":704639,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXoUnCRA9TVsSAnZWagAAPf4QAJH1yvC4+Ik0k2D21c9M\nnChlGzoXgutifnIm3Q04w3gp5ndUcOIqp6YdwKWsMr98IGKCURNtIoT7WR21\nBLuFE63nDZc/HQIysTtORNdOH78f3WhQak6TkvPKiXBBwaETWDKHSEtVcYCV\n8SzzAWbutt23CTqOLDOf9nBGRAF8vGPXfW9blAEFe4DpI49/Z7bZOauB+ZSg\nq75MJfAwlwaK25ayZu63NXM40dc8KN6nxYZ4Jc8P+wBGkIyL5CTwnzNb0gff\nPaQceGIZClt88c/uFV20CnHQP4PuFnDOIzB4oGS6WiiJsAtizuN0Tiis9XJ6\nSVMku/4He6+4z2Ti8Na+qBmnHNHv2zWzAfvqk28658RNDq0hxbA4kHq9rnS9\nWvx6KslDhOl7YyJuVeiVV1Xvp/xHpJwZrFulyjQ/2WQNHPG7poSpZAjCqn59\nDqOuwFfawnLS91CzJZrWjTfDe7F37jSuIRh8dKfX8M83w50P9ViFk/pXiZA3\nDQIbKlYOCU5TwhGicDabW5Dlfiv/l54CoI/Qxr7X09ISBvr4EFRhfE35lnXR\nIAenvn9YpycfRNVH/qqhbItRFrdmna4qRJCNqPkC3wCz6Q9YxE7Qh3dCkklo\n/3q5bsHPqAi/tV45n0xlbY6c9sVnLn8ReDRFeSAzpthiN3QF2eAF0VhyqwmU\n3HHL\r\n=NWr3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBBYp62dYAFNQfj1Htd+FLviJDez+9nvlt1mZW6HzMiXAiEAyKvYaQEB4pMsB8WZ6Ft9g1Fj4kEUJuDRXhvwjGXHUw8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.2.0-sdm-pack-drift.20190822120156_1566475558686_0.35404808616475614"},"_hasShrinkwrap":false},"0.2.0-sdm-pack-drift.20190822121605":{"name":"@atomist/org-visualizer","version":"0.2.0-sdm-pack-drift.20190822121605","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-drift":"0.1.0-master.20190821065818-sdm-pack-drift.20190822113235","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5b6ee1b94e63792813feafd914ba6c7d4cfbbce4","_id":"@atomist/org-visualizer@0.2.0-sdm-pack-drift.20190822121605","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-5rlXQJZTHU7Eud27eWnOzjUkxVXKLDX7znM6AP9bm4ZaTYc28pRmV6Kb0fZM+0rTkbcRRT27F5PdoBg7X2DFgw==","shasum":"1ea2b5c1ed7302cc40c19861154e3cf6d86095be","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.2.0-sdm-pack-drift.20190822121605.tgz","fileCount":95,"unpackedSize":704807,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXoiMCRA9TVsSAnZWagAAJ2cP/0PHPJeKjLiY7lwHz1aA\nI5KaPRlWhYHB7u5OrMF29IuyVP2hI4sidnPRUVhpx9gm/kobmglF6KPPY6LF\nh4f6ulTGPrvFJA7PxeX4Tf95iUbpD//JMamxwJIjcSKa9WncLbdhgDB+KPkV\nppqjawP4bsMD7mpifrjfRdFLHaVhUAqaxD469ZnU/WKZYoriMkpZlpLKCnFV\ntJjZgNw0EGnLj9G5OArjm18kHWHtm6weQu1FSkIb0wK7iGG0Zghmuc6k6rgV\nMTRs0tKf/RkoGNSWXdFR1LpxRsDhPxw3MBkj8coA9IJCJiPU2n2LqdgMSWeG\nQ+F83wHncbd6/oaHzrrubyRnnpJn2PHlZgAK55o5/rZVubqp3RDXOWPGLMne\nea9vnnQpTHW9JG92+8C5Fo9sZI4fwhRFT6k4tGJQfSmOrTeXDSEuL2ebWmmw\n5XTUuAUH3Tum7TK95eC4zgS69yspVqU9mkX1FHt7Ppn8CQ8Ksx6GWLFaW2L3\nIyWYsZRtjSB1eGSWI65ZSTqbsozcA5tg/MWxEEIOJdXQ5VP35PBS9QwIKIdT\nOnpDeTpf6zFWF4DUpMIX56Up6dEziqiA7PLJe1adIj5BnMGHiXdQSBMm1Rg3\nZ2R4Vism0mRnXMaG948IosqlGh1TxgK1JMcWoRhEOkG2Q4Dlt3fIp/1Xj9iT\nKwql\r\n=Hxt/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGDroJs1UKRVvTecOhY6bS2a5GC0EvsUJvMpsw2MEDewIhANz04WfAIhzkZa5++xqyT0AOTuHQaEiA+bjeQLco0zYI"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.2.0-sdm-pack-drift.20190822121605_1566476427301_0.9827612235689505"},"_hasShrinkwrap":false},"1.0.0-sdm-pack-drift.20190822171940":{"name":"@atomist/org-visualizer","version":"1.0.0-sdm-pack-drift.20190822171940","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"1.0.0-sdm-pack-aspect.20190822170455","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3c047ed8960d0d9168524b56f4a20f675dec2002","_id":"@atomist/org-visualizer@1.0.0-sdm-pack-drift.20190822171940","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-/P5kxromUfMx4+pjfRf3vomnRDKm0m3YEpaAMt8Hc1I3eCoJgwl1N+b01O6u11xdUKbaS0LqHHd2nnarQqMFbQ==","shasum":"c0658d16e7b8129226845acf8e6d0ba5a3bd8821","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-sdm-pack-drift.20190822171940.tgz","fileCount":95,"unpackedSize":704703,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXs97CRA9TVsSAnZWagAAR5UP+gNL87QDSD68qeGBd7tb\nlysLCquSK2nyY28qRORAQe7lrsO0d05fe41qIsmGATkXlfqLqskYchin0y/a\nFxtsfAK91A9Hx8CarBnQLHEeJMIO5vruUZxfjzY1EiYft0Wh+BYWuf477VAi\nGgcqfDKCN/mqHikFak2p6w6vWYmI825g8p2QB1mi34so8z69ZbibooVDB5F/\nT71btpUCpldZypdoo9c6LicTeJWd8nN46qTGRG2NaQQqt5N93PHt8hg7ykPF\nmrI0ggebtKgjhST60/1gNevGT86ooOio02ESuUE3LVO9aFhXGqK+dV1ozG1v\n4HWQpFiZNREC61t2vpXHca+3zGR8EldegUSkgIGd4YM2HbYNmvAIcC9fz8kM\nYWIihGpzgIzTCnhsrfTv4DrVUgEGI4n+sxcLUU8DynXJA2o0bhzq4tXRdYDR\nCfhN2raGzkNYXReMe8Zsq+8LL4mhlFeXriqvMDJcaTOjeeEb52PAexVr+i5I\n91xtlvZPZxplSiogf+lFhw7mu0nXsNzzJ+MCDZDf94CGXxLY0yUd/rOSBy/f\n27+IvMZfosSmv74bLEmJWyx6TTquIlDdc88HVTwbl0afaWw8MqxIzNM97pTm\nx0IqnHcA2Y3tZYohJIVdxxXbNtHlsJvFQc7R8S2S3kdaGZI/CSGOUbFmMTcV\nY2uU\r\n=Aq78\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHmOpHcOv1WBJsTdX0vnlXP/MpUMOWFCslU30S/5JhNlAiADo1uLsXckY0LzXQvcldod4ZS4kM30k4bp4d7ciEIulw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-sdm-pack-drift.20190822171940_1566494586477_0.41725937025471227"},"_hasShrinkwrap":false},"1.0.0-org-visualizer.20190822194108":{"name":"@atomist/org-visualizer","version":"1.0.0-org-visualizer.20190822194108","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"1.0.0-sdm-pack-aspect.20190822170455","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"97f1ad07e42f6103877134b97cc0282da26d1f89","_id":"@atomist/org-visualizer@1.0.0-org-visualizer.20190822194108","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-FobnFRJ1FsJ/2S0EYnMMkfNkqy3/AcLcd0awmeZ/U8naZyNvNlEggoRCrK9IviZu5hbflh6oQ4XTlgLlTeWvWg==","shasum":"fa70e73fe34ab99f859ab1524329011eac98e747","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-org-visualizer.20190822194108.tgz","fileCount":95,"unpackedSize":704703,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXvFPCRA9TVsSAnZWagAAYrAP/37dQ3x4tX3E4Q5YWTS5\nFKAVZGl3ZRVrNYp9uL236HKJijnlbMhjzhpjx9u7ttKCO5myyrklDoz5lQbI\nYxSwhtz4UkZBzuLZt9CXhndKGVD6Hdmk1z2bOPg+dO8OJES7i1fTWnzxVHoq\nGApOSnt0qBCKORwv/LPdv3Q84IL2rJdymx3FnGh1OUygrqmJlGnOFtevHmt8\nukVeBNMjwHxKUJ5jbIRpZW9VbkzzArMPZyG5Q6R6f2UL20enQiU6aijS4T2h\nvZy7o+lNVsPlfBncuukFQOeTfRUFZp0ZAJDIPV4b0fDiaodniFhWjn6uRL+4\nStpAE3l5/3MdMpiAXLONvmT/NOuWCiGhXFUx31PN6AyUe4ALdFeetVgA992M\n2p21WKGzfPEGA7bHxjom7xG8dGKEFyGSVfKKfo9LM29ah4qF/8ozsVEAYAPU\nMQhH9KCdn1BBVyPS8MVW3i4zHQ76Iz0bO6YWaxnckdOfK5UcLb8qlHw5K88u\nym6QuQZDsiobZ7q7pkfHrLXpPHGQpNEEqzpU0Tkg+Q1fUfRF5XNaUl8QjRGq\najUFe0L35pLk1gslvGAnM/WPcUnF+ebmOo1ufWlaji8De4n4NvyK+sZIG3K3\n3ZvXjeG9U0cnl6XwZW76oENxjRfWBs25nDWBTiUlIO9yupMGTDLeVBJrwcoE\nOO19\r\n=QQWo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC4mhf4oxbNKIciurN2YKYS84+I386OOvLdc1mVdGKmPAIhAP2MGzGxwxKpod4V1wlxlGQbSwSaksPTe82w6JvOZ1oj"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-org-visualizer.20190822194108_1566503246749_0.17158911415482203"},"_hasShrinkwrap":false},"1.0.0-master.20190822200737":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190822200737","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"1.0.0-sdm-pack-aspect.20190822170455","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0f93b0e251881f9fa4d16250835c335c483bacef","_id":"@atomist/org-visualizer@1.0.0-master.20190822200737","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-bPEJkw5MqGWP9D22x+b7p2GY+LeVVzhXQTJcZJAZgJIwGzrKn6sh0sLPW9aUQaYmXBfuMcpSmW8n3kRJnxps9w==","shasum":"a33753fbd966ec09646e07b616fbfc2815dad97d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190822200737.tgz","fileCount":99,"unpackedSize":707546,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXvbtCRA9TVsSAnZWagAAcVIQAJrHuvrvCfeGQtaOC98x\noINfcJ8WqlVrFB8XevwRNpRZldUSKUf3wNzhgw/1PFoSffJr+5Vy0f6bolZQ\nirozs/MnaLgMWKK3pZl+wpuOT5NeRekdiVjNIIQQ2S761/IXMXOklU8oxZqy\n+5Q2YxSyeSXHUR4IUtkteQX0xQg4MCts0mp7Gze7OCE7L/omsNlPSL2Vktq7\naGaP3xZ1ToeRjqlDmnucFzryJw7EYFpY0vcsBH+8Jgxy6Ov6NulC61rh127c\nHipV0OQ5ugD5ovfDom7HEs/J1yzWHfRpCY1vhR4IifRT2/EfuQmrcYc+0Eei\nlvaYawP/siKOuRd4ZA5C6yY3GNCCZMmQZ3Cks8AI71S32s58u4sxRVWcTkdC\nnsQKpfXIXFfsx+lJktJrwYfox54SBCqdEP4FWeVr0Ur56vnqSDguyIvDX8qC\nOzgQO3/iVWOlS/59PDAr0ql5jQSlIDoxHpaa3ofs81h6nIM1IyOaJy0kN2Np\nM9YAgHzDC3XTo+Sc49nANRdHtEyTTQXoiFTNS+gvjyrGUYilf47XOVQZ3Tkv\noKuQlc6VQlWwYUKJJ9aGD4UB3unArutA2WYII3BzerFcUvSwDQPrdRB2afOF\nmEptqmlev548VJpDPc5KLmI4SMbddg538j/aY3adlJDxWOFGM2LhsrPWhemR\nojFI\r\n=ZUKK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEVimoNJ7S5s19uS2Mz8lPcDQpmeVN9IJtVfz85OptdzAiEAyMBgsPSIuFjkk+CLLA/W3cBHN4iziPUa2DBOdnSDdfA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190822200737_1566504684960_0.31842994112119194"},"_hasShrinkwrap":false},"0.1.29-jess-tsAspect.20190822201156":{"name":"@atomist/org-visualizer","version":"0.1.29-jess-tsAspect.20190822201156","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821114832","@atomist/sdm-core":"1.6.2-master.20190821061442","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190821171625","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c4fbea89c56d9346acfbadcbc6d0e21d0a53f536","_id":"@atomist/org-visualizer@0.1.29-jess-tsAspect.20190822201156","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-5XStht3kVBvuKszS2JKAhWzrfM8wx1ePwk1qrkUhHwsAf2MRSpa8EpLxvA9/9+2Mqo/yGhjUTVo95RBaaxAiwQ==","shasum":"29d01fef2c4d53cd74e413b1d0c5789717496b67","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-jess-tsAspect.20190822201156.tgz","fileCount":428,"unpackedSize":4432761,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXvfsCRA9TVsSAnZWagAAPxMQAIrcMjYjCUHxgeQ4Z4eX\nK0sAAb0K6tVJRbjnDdl1H/VyrqYhShOxbTuLp/E0RHyt9Rxj/sUQHz+U0aT+\nsar4wtIb+55lsQb06tbIDdXhmfNjfQsalm0Rarz4cJpZMf8oI31It2LSKKJ8\n1fRWDMGKWJMwPFc3h7n6svjYuHZagN/PSKnblWM1DtUhXdjmeYIPexiAF+EH\nnMjAu9DamBb663nAY1bSDblbgORqhhLHcyBFDNSI/cFruNGF2aW+KGCQcAJN\nNMkkzXni7kxHIg5SUtUAR0/EIqHX826L+Snr0LqaKXuAVhdkF3rvu/ubBUjk\n8+EIKp13O7nXXax6oxXUV+m+Qwn/7Uh3DP0BC61ZwpuT5jU8LYrUK+xSO7gY\nBwaCOMnO92ioE/dOmabxl7WLZSPXW7zcJlq7l8BDjdpf9pbqCb2VHGnV7TuP\n08P25z0w6nxzalM36V0l2Mq7J4PH7++2ZUEl9zmF+2a3lRE2TxyDPZxcNKSc\nYguAHEB08pcCx8VfsAdVyP8tcRKagv8n7JYeODMoEc8ZucftooB6ZjoBGPWs\nKK/CmAprX8HsRiYAzNE1a4x/A8ZYEqJpjrt6N4ZsUGY04w5Pj2IpC4jTC47Y\n/tYlUfxvFAn+MK4edKwzqE9c4kqQVpfZQbg9P4G1/Y7rWp/fcBG56PWY4gmA\nxHrQ\r\n=NZlU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkrjAGYtFzsW4mbOyWt0mTod/vCy2iJKjI/BGg4UxBNwIhAM6W03Oy/0u58GIcANEpK6A3wKXm6J81FjPfTTFBOXEF"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-jess-tsAspect.20190822201156_1566504940273_0.984506805905516"},"_hasShrinkwrap":false},"1.0.0-master.20190822201829":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190822201829","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"1.0.0-sdm-pack-aspect.20190822170455","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"86dad32ca66de072f3ac3e33faaed8b6c43936e3","_id":"@atomist/org-visualizer@1.0.0-master.20190822201829","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-JLYJGPi1v8wzUm4K+ahxSsv2aWnqZTxg7vQ8baL9wiDQ60EMTXUNWRIZt8b701VNuhHWVkrR7pO2MPK8X5odng==","shasum":"b40aabc050860a56ba6c603ea8b9acc6d927d51d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190822201829.tgz","fileCount":99,"unpackedSize":707546,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXvl9CRA9TVsSAnZWagAAkD4QAJIfOdVe8KK1+ipFKZp4\nhMzNV6zI9I5Oahsst1kk9rb9DkjvbBxySde7akIUCuSX4TYi6hnAJyztrCcf\nrqmAezA0E1MVAm/pBd/tlJTQY3RiI8ZrFxKBQz/MuFjMkKudYkbwFAlAg5HA\nfoIM7kYAwpXhfU0ym1GkCTCuzYSbCYdxEAzppw1JB2FfycSWMTCjYhu2De9o\nl8cc4xKWgVRlmPaby1f0XdbGSnlTT5No0kaZ1u1EUrGINiYkvgl083o1SQ/B\nsz2di+fZUgNujW1NCTLDgiYhsGIHof6LrMKtDJ9FyJUQYzjoC0jZBwrFECvw\nAn+fuM9fEGCC3i8MmQJTRqKP513nFd4STIrsGHC2uhNQfw6K7YDcCduwi+ib\nzJoh7RNtPHjZ1dJOGqJzcdbDQ+P7r2OfS9WOk6rNbgJkvZOXnwVTy65HXePH\nmmDlXuvmPkJemHTMCFru+SPn4W8EKOc4/A4yCsyT4vlZGN0REQ/LUzG7CCqW\n52xWKo7S1A9Icg5Dz0qhVOhGoQxKCilsegmyHAKUoUsWF3SFZITuGHXsochm\nAQJdlDJM82MpfHvgevQhCfvTuVFnVDJDjQlqOXqxyOgCkDa7YdczLxrVnh1u\nSsrud3p75jRa0dUdDvYhKUXywjDOUSQZMf8oHf5zL5brjjbE9QpXRPnP3O9J\n+0JJ\r\n=1ecJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCt6JzfUyHjdf/kydcdWZaw9hKaCtDdL1DM3qtnhElTqQIgUoyF94bG8YQouwokfpxs4Hb2FvG9+BDn8PEdAxRfeRg="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190822201829_1566505340610_0.3699069641155268"},"_hasShrinkwrap":false},"0.1.29-master.20190822202714":{"name":"@atomist/org-visualizer","version":"0.1.29-master.20190822202714","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/sdm-pack-aspect\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9605bae75d9dd4bd4ed6651187de82e6c38edc2a","_id":"@atomist/org-visualizer@0.1.29-master.20190822202714","_nodeVersion":"12.6.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-iRd+moSaTsB3bJSkE3A+trvB7NjRT0qOaDNifk6KFMN11hWIkIB79c+adRyQgQHsNhJ5eMu4PwVteUSXPjqyaA==","shasum":"7c77a12c63a7ed2336094a7d77162bcde15775b7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-master.20190822202714.tgz","fileCount":425,"unpackedSize":4428731,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXvu5CRA9TVsSAnZWagAA/AEP/RKFn8K48QVkpHgF9YRs\nlQIlbaxs2DkG3vK/m5HdW+w9sAh+TL+Ar7TB13fbLKHCjUuZRq+H4e9fq5ev\nfS+EtSDwM4T74+gKcUadTLOPfUBjMEquyclJBp+8R2REsZBgJ8xpfwMd4uW3\nqLMlMirvUbydd9GNl2RD22yb44T7Vmywc5zBdhPJ3O8WDz7cMkdeMSekWvlQ\nwp00AcFS6ElxMSyY725JEhA828dTc3XJXt//onNm7qR958oY1UmD42pZG1aK\njtXEaYMLAwitgUCHxvLxAfwA9qdXsMIrpVWd5evKA8U81LG4xTA3eTxWzQH3\nanv9LLQaCTXZdwiqJU5znl9fVBjHPa1aL+1SS8YcMrwKI1z0UoXn0CoLZ5EC\nGSzimOpwM4hJJNtmbY+G88+v5HD24bKGcpOI6ZyKRGU6h8OW3so50uaEv/cG\nepIrxyeG27OsnwTSs3SRhEpJpfUhyh4V9ZQYWBZiaBo6FiBJsT96NJFEUAs8\nD96Zxg3p2phWgb4CrBgi62nRBN+F/qehBS3avjAjLGzV8uuY9Mm65xG91ZXQ\ntWIVaylHRHGw3PKpeH8CTDOxVkzKK3jjSc1wWs6i5+6PEw43odYjbxyRH4WC\n6G1PfOY7x/4cFUfh9YvU6NP9UCK3ZUO5geKelGExoNrr0dllGK7pL/CM/YA/\nXS83\r\n=U2Nr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDZa/4tErPjw+q38sVpgNrRxBn34aXJvQqTtaVGrch1JAiEAmaIzMMFJiPFJ5xj44Dsj22553F5w+ir5UywSWAocDyw="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-master.20190822202714_1566505912316_0.7838888959887378"},"_hasShrinkwrap":false},"1.0.0-master.20190822212712":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190822212712","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190822212524","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"39324d431a0da8b4ae301d0c0b86e1d52a3b442b","_id":"@atomist/org-visualizer@1.0.0-master.20190822212712","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-4Rv19SYT1OgAXGAORdm//ef+dYsCUSiSpi+LlgTastbYXisa6/pcpghtusDdp+/hkFmiYgPTSUan5mLIgUatSg==","shasum":"d66dfd5637f03c5daacd307ad5233da5b9a97e61","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190822212712.tgz","fileCount":91,"unpackedSize":681173,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXwplCRA9TVsSAnZWagAAxpkP/iUVErttAG0OwUx6n+Tf\nmwpOFH/d16XL16arxNdyNMblaWyxyidktcBKFc/OAcNqpT7cH6oml8EXQRRU\nmsuxVDJagxzf8nsHZY/p7pC1xRh1urJeSqK6vD0jBLIUvabP7OUUtbP5O5bu\nxBMEgSQ2XyHJ0shF3I/xfKpQajJHV6HGvaIh3D4FJ6nidYTSi9+3X2A+2hmY\nk/5Kv/d/lx1/Mmujra6/CZyzsr9BtRfGgwCau8++42blQYC56blsQEojXP4r\nrK4BtCMLv2/7QBDr2h0kyvr5iUgJhjHSFMJhWNlFJ0yMttUDN2WiQ/+gaOG2\nHodNaCVA2my2WTrmUXAt7ouMyR2cc5N/8vFtnqSp3gOLAjNXRH2k+Z/t+faf\neDLDEdLYCbtVswJLajArgid9A4FeuodcOxeT+dIPKeYbJYw13Q3y+a80C2p6\n6d06I/U+f9ZFjs4q61OnjvPtLbNT7606Ri8JyPCf8iaFQBganxUNUQUM2TUQ\n9FQiPKLJ7qXpkw7uBW7hEnam3EZ3cuR+jbMkiR5QqjnWAP6dnTfrs/j4tGzp\nYt70V4yESP19Wg9GmVitC4LepSCLx8MJhjlZ75o4Vb3T+H4F6ys3I7sYRjCa\nvJ/zX6vCMrg/lTw/sgHjb+jS9tzbLSCTLAtpWLbt3SXVmkzors2z9ubTOtsw\njctp\r\n=HtIi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDDVnyz2IBdxNpjjyjlc+lW1J9mOeq/CmuiA+UkrbsAogIhAIajZPHZdzvGut/R7TMJVft0H1HstcEd8lwyDA18W9Oc"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190822212712_1566509668633_0.07190740023369857"},"_hasShrinkwrap":false},"1.0.0-master.20190822213548":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190822213548","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190822212524","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4ac58314c1b719c87a39dc1f0163475677dc9bc0","_id":"@atomist/org-visualizer@1.0.0-master.20190822213548","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-iWcuonx1H/LbrmF9kNqlrCTzIjyhvoxNF0eBqLt3crs6ht9OrY1cysUhnW+Gru/GV9sdr9nNYfzsTeoCYdvNzQ==","shasum":"7b334ca4b468ffcc33f4db5d44b9b7d64cb62108","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190822213548.tgz","fileCount":91,"unpackedSize":681164,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdXwzPCRA9TVsSAnZWagAAbDAQAICF2AASVaKe51LRKbtq\nB/IBIZAuKoDwf2cbVVHpUDyN2RIUjGoZTjbh+iTtaQDRLLqIv5YyIcSYEU1v\nGNkJI0pivbpy2tkTCNlLCo5E7ZxIVn2xrXFlzKQfI4CQwvifluZ0b2ihyogD\nXFyX5a6N+OUkDVR4CxoCOzN4e5F45HzsJLuwD/JT624Jp8ZL987dqS2uIwYK\nAR1pMPs5ObOiXx+0lepR2neyeH18S7MYjWu7J8teBJjE8TskHwqKjVxZh4sI\nIF3DgmcZKceZGYFoKK1jSy0UcbIZ6HwB1q/OOC9+mEZ4fI6Gxc0n8QpQJ5r9\nBb5UsOPISXBjtXC9X3f4gD9MhfgL2s7z+xs5qgjtHSu53rltpET/XWTx+M4i\nHFFIoFv5r1VZZ9uk+Lk96DuPco0fd4noUUW/9RHE93V0WlLQvwzVoSSBX7Kv\nxALAWCkzS2s7wbsvaIu2gIzBR/heN8D7ISSqWUeLhGjRTnbbPu3P2K5Or8X+\nU+AqXJ1n5BlqF7/ucS2zK3X8sSBjWqIY3xPG/5+zQzNptRR4ao/6bxETQtCV\nVUWkgH8tmFmRjNeoALktZPwNGIFQinMJP0UsiAIjCEHSKWd0Zp+qrumF7uRs\nQuGDvDiNL5jbYs5y87geUAmOI3EjvSMV3mWIseqjrIh8ExI3Le4D0df2iH+A\n/nvc\r\n=nxd8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCb/e0c2LZpmEkNci96ll6ie/PEPmqcaIf2LX66vUj/sQIhANv02rz25OkXPTgTtd6O44lYXt93nvW6ARWT1tCw2URu"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190822213548_1566510286504_0.5902574542003134"},"_hasShrinkwrap":false},"1.0.0-master.20190823023521":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190823023521","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190823021947","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190822232250","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"daae2b74bc186e08ca9fc401691928f4f59c2608","_id":"@atomist/org-visualizer@1.0.0-master.20190823023521","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-zd5+eOOinUgnMXNWSI4ltHc4YpAD/IIqdvT6+DXNSPDFDqMdRgyyjgx6y1ipSKbDzFxhuXpUQen7wCqDUzAshQ==","shasum":"a6e47d87b59f23ce9076452a3534f14e7ac357ca","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190823023521.tgz","fileCount":91,"unpackedSize":683632,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdX1NOCRA9TVsSAnZWagAAuwoP/2RiFWgFOgWiHPh9kPoQ\nHX1DopZ6bLVs1oA+6byaVKw3xtZRrUCA2E69OBpuujGluUnsGJLL9nad/DRV\nDnbnLuCVWWYhbRteNDbOkRhDAtcIZPOstkpzZtatac07DIHym8nNeCLfu08F\nuRDcOnN8LYsNPOKs/L3G3yIoeS8btV5hQoC0ABI/1Vd1tuUac4XO5916JrI0\nkImBREHEa4KkFXmjeJijlhhsxM/hTfy+8IhlJ6q6dsU8f2xhWV9Nz8UUE+7a\n80hlnqP/+quamNcd0mX+hMl5O+V3g6jLq4Zd8RkKFJYqH1SIIzVSD+FA+qWp\nrDhP6U9A4wAS5r+rndeRpL9GComCC5VnNarxShFOJZYuTyucXokds026nOKp\nHrIaRAFtI0+PRbtqES+FQWglzsJsXi9x9pIFAQK92WvdY1qvBeOGGdOjaxfu\nWPmfcAwV4kP/09IwUgCsOZN4i7QKr9QINtHTvcaaGN1oXTXF6XJ1DnVff3rt\nJ1GW7n4QwWLIGLWx0xdWQapQ4sFeXcRutSV1RD9o4kY+UY2OQ1H1tuKSXfxG\nCkRtUx/YI8KioPFSVb/O6PdCCjsE6fb0NC8D74LaCWIRDUlUT66135KLEuF9\ngNvkEA7taSvjViohoqpyLwacDcjt/FEHqWORgaRIkruPZAR4mYrfdMkXE6So\nNfSr\r\n=Y36u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC1hmJA68CedKnphWd894odJKsWgc9fpQ4asZ47lhmqkQIgWhKxaHHrFA0AEkxXiF9UEKhuTc90NYmHWka9LJpJza0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190823023521_1566528333547_0.4262821104975254"},"_hasShrinkwrap":false},"1.0.0-master.20190823090135":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190823090135","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190823021947","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190822232250","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nBefore starting to use org-visualizer, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nIn order to clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d084e4df818e39c0da4819b464fa7ee1030ef442","_id":"@atomist/org-visualizer@1.0.0-master.20190823090135","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-NJ/kcOX3db1t5pvIyRSdBR3u8ODSkb4zgH9cKHLqYtc32EQilSyxoPw/iEvvZWjn37AoYl2si58jmdeqkuEWlQ==","shasum":"c2705aa14b8f04758e148e549461b409bed5115d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190823090135.tgz","fileCount":91,"unpackedSize":683868,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdX60aCRA9TVsSAnZWagAALD8P/i/6SrWTW0XnjqhyHuC4\nKEq0cGT4VLmHMa16cTtrRrsnMk4WQD6NabQ/UrmfGL8eIty8yAPAA4xjijB6\nkm3fUrDcXSCn2awYGo8GbG1heCma3dAaR28cXj+bT5Qo8ub2azfdAVotWqe9\nOSYfUGFV4otf3H+QU8+IhzqVck5BU7IKmmcdjhCkxRfd8YQlsqGj/xjyKF2G\nGt/e0c4joIVC50mdA05Gz32hFfIPFN4Tjrzn4e5pekY0FRZqN3XUaMTa+vxI\nd1vfbv/kBK3aq5SurazFF043QrxOS5XirQ0HJ9+UFLYxSATMoSzZIc6bvGQ8\nXjMqT5Wsw4qfybpxjOhVLqBZVZhl6adBODuO3QPZVwOlC9s5bhChl82Jo79t\nd1HML3iwqkErUYPIA5UZaaqbKD0CVM9YyTnFXSqxh/UW6LjNY9uP+TTcEWh0\nYOAdqtI2jofCP8aj8gjN5JBhsN1X3KsqNn+SMcbuEJSIJb+cd50BGkf/Sr4t\n9GUpSIFZd/9QWdnSk78NaAmD8ykkJ97Nzj5iK+c9xC+VQe3Zn4Uy9fBC/mxE\n7NJCwqxVuAiQfmnoTIXiMqfjlEVNcsXNJvcjBJPlMklhhl0tok/BYGOTfspZ\nAm+oOxeaYrffIReqiTy/b31Pu60hidyB5tEXCQU8rcAC9NrJualj8PGShvZH\n9uqa\r\n=JwBl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDzQix0xy9O0Z77Y3luaOfVqxIzIRP4uNyUEuz8VwRFwwIhALkFCSwdecAP7g19TG4+w0AWXQBzcaDAlIBx4dac2d4A"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190823090135_1566551321880_0.27386422929406207"},"_hasShrinkwrap":false},"1.0.0-master.20190823104213":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190823104213","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"1.0.0-master.20190823103332","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190823093033","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nBefore starting to use org-visualizer, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nIn order to clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2400a467a30965f8378712a808aa5443e690a4e3","_id":"@atomist/org-visualizer@1.0.0-master.20190823104213","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-znZc+8/G/mB9QUUocr4xL/HmL9KGZfa1Wi5K1NeysH2Wz9A86coUZhzMJ6QuCx28nMkOwOz/e2zQwNCm1qb3Nw==","shasum":"b23e1c93af0602457a59197b086971f3a720dd47","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190823104213.tgz","fileCount":91,"unpackedSize":683866,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdX8V2CRA9TVsSAnZWagAA/zMQAJs7JMyMxO8RMnYpjjnS\nC/Ty6rLKx5+b3ZrnDy9RSCsgLIK5watOXWFHu3cYRhNgGGVnaDLt+K4Viz/9\n9DsobONkd+14xMxc72MVMRH8IG3DiJP3KZmEAMQRkBG3aDb58u1maRxOEnvM\nchjm/1UImW5GMyaNegC6zGxnuL83l2M+0jyJLFH/UtV3ZpFiC5k4vqJOemez\n7PdcvzLuRdJb8FXxumjQI2M7lhKLHyeoWlEzGQsvshhxRJ3HNrbQNQcebCKE\np4I00DG4PqmXRT3JKxmmMSv3MIr4n3hyrW31kyod41E5iGSa8Ay/KDkY1l+F\n1tWflEmVmcXaXm96NOaGvYeCZ3ThTXZuOI0s/c5rXyhmA3z5LYuK417T09ff\nyN4HCOWBCEKe77RhS6cGw03fwnpeiWWeCjv3p4ckHX1aLWVKiRmlz/DwVoza\nXIXT6jZqHSL7UAh6qDiogwUwzxj/ahkU7Wsva0AvAXbjPHBptEXPwTSewTLe\nDYHsdLR8RMsQlE04OG/pcHMpYDCY6T05fxTZX3Tn05ep3obGIz5xqe9LjmgE\n4K4qUAW96AzttwN+FERV6qDA8f3uCLvPbyWw6Z3Y9hXtJrnr1rITg0EkcfyQ\nO77J5nnbMeiackTcc8JNGt0ND5fBZYcVpJk+LyoNr6zR1Y/1HKUznoHB7Sfp\nMG1X\r\n=QEeC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA6jLdtF1uDcUCSiiPlUeymDmAx6++mOpo6cVAEhjnt2AiAIFJiVRs8CUJO7R7MznKbOoQa4XKEzXvQHWksFzdhlIg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190823104213_1566557557519_0.2075900071313843"},"_hasShrinkwrap":false},"1.0.0-master.20190826025636":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190826025636","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190825221206","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190826010039","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nBefore starting to use org-visualizer, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nIn order to clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local repositories --localDirectories /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ac969b19e415e8df5216661a66c7ad5d081fc0b4","_id":"@atomist/org-visualizer@1.0.0-master.20190826025636","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-T/kACVekUktWJgHb9Zj7OafVowcbsfLECN7f57kaA/3FtXvYE15nqK/dB9wK+ius53CvGfFj4JbVy1sIAkp9Zw==","shasum":"41f933d4bebef60df28207509deb00fba70f3c1e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190826025636.tgz","fileCount":91,"unpackedSize":684578,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdY0zbCRA9TVsSAnZWagAAEioQAJKlRWjKB3FewczhcO8o\ne7CuqwaTreSbASTrvP5XgHJnE73nCCraMztDYmlduHONZRbLeWS28wrxKQHA\nr1isWf6ASMt0nPzEfiauAWX9ATW+9Konph0EF/Gm/SRjBKbV2Zq6HOUv0Z7a\nlSupokjSV4lv8MnnhWcEPbMYwqXZu0pBlTPjc7OAGim0iIKQaU1BsCKzFgDm\nTVDyz1IFnhQxc5SdgVtNSIk+5vWk206vbtYx2EqnlLk0UffVkhf7IjffGCtI\nOxNdx0EZF0lCMAzrpqoVxLatxAPHV/KPP7v+DpZoNMEMDl2K+YXrJ2IipfHr\nQm0IA5Z/XcalV+qO3FngFogV+tczj2xvrQhq3RO+vYCQeqfs/9dvbsek11zX\nR23vIqFkTL2xrSH9c2wuZqC2A8iinV/1w+7kpyj56hJs4BW218pOgZiwMazP\nzlIAmifrx3JXgunjj4TNunfB2LmvGgquV0qg6FpDAyH1c+mrwl3tQPUSd8YX\nRms91zR7PrvDmCpTlbpUniI2Cqmr6IBxFc8HaLH43G6ptzVZXMOQF5sTqvCc\nEEBUw43F3sHVbiidRpN3RCOznaRaGR4W6s14Dcp4fx2ndXVbYgw06JWTXFZm\n8jAM2G5n9ibww2cTINUj/fMhXrOGJ7GCzdl9JzKf7/8z3jsX7MUs4pYOAy06\nXSdy\r\n=HFYU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHx5lNhteuahscapFlIe68kU9tLqRRsgsKqsYSdK+KfGAiByPWwnldntzDpflpCdEwA5VOsM4ExuLZWAqhmlRoLuTg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190826025636_1566788825603_0.6889590473305958"},"_hasShrinkwrap":false},"1.0.0-master.20190826173129":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190826173129","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190826160021","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190826082455","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nBefore starting to use org-visualizer, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nIn order to clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local repositories --localDirectories /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"70cf49ecbc123b27c931529ec3d3b4bef09ba780","_id":"@atomist/org-visualizer@1.0.0-master.20190826173129","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-9XQJQVyp1kuuVrE0SwFid1C7gr/GUemIPoeWxsBchXweZoeLJSX6Mb7vgHB2bQnTV2JYLK5TuTEf5akt3oFm0Q==","shasum":"a6a4692f10cd9ba3734a70e171322070b9338b8d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190826173129.tgz","fileCount":90,"unpackedSize":674048,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZBnbCRA9TVsSAnZWagAArLEQAI1d+5FLad0DRKa3FgYa\nUAgi58j5fBAri02t0z61MaGtwjU71hcMbimLlZaaOI9uI6P+pZRYRoYTwtv7\nXSs6nVe0BbWUmtM44URu8nPSLTZg0ON68X59unyR8KaS2uElLUIeO7bJ6Cb3\n0CscTaJ8JEoQCaSymEQ6qhxi2rxHbGs5k3ZzpKodeV0MxocSTAvJIZmeOd8k\n4HKLuKGJKWBivEd+F9xvv4+R3+hPKQ2hOSVVjNaKYB71ih3GpZ1YM7XcSCtE\nGX6hFM3QhEbstug5PFm/LflNHDpEXiZGuEl4+gs/qpMRaDWSACdqbcpIl1xG\njXYrKx+0MsZF8AcFXM9O/XVAFkHODzlNH+dO+GnAlz6kQFrrSDhUglH2lMvL\nkyxFDqtIXwc3cRLA0sK+AKQA4lVS0VIcAsTF0NeJocu5oNU15szjeUpBUQ/x\ngDZ5+p7w5kqAsOH5pZo9YCoek3X6GrVNAhSr4uDH/FsPt8N+ao9p7a3cOeLK\nFkIQ74oXf9EYUBNtaWXl7GzPCtDYa0ZMZtGsgalff5+zA5Gm9wfb1v1y96cF\ni5w/sEALfpq3wSpN1iPNMer0GB6EGrZ6KCxc13p6yy/7KrmO3tPQoNCx4CQ4\nJnDM80+Aee0wDG6Bcu4eSz/ZiKGReP/Z/JiaeKfhC9SdEJaqb82ltD/YuGsM\nIAz1\r\n=1r92\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCh05L7cGznsc7Otj5Dzy3fGMReJ5AMcOy5xoh1GerJ9QIgFK6yg1J0twHb9yujnJlERamNClaJw9pNIAPw3/yv9UY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190826173129_1566841306641_0.5531707862562842"},"_hasShrinkwrap":false},"0.1.29-add-node-engine-aspect.20190826204955":{"name":"@atomist/org-visualizer","version":"0.1.29-add-node-engine-aspect.20190826204955","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"af7d88f6deb9166461fc034ffb5bacee62ed9fff","_id":"@atomist/org-visualizer@0.1.29-add-node-engine-aspect.20190826204955","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-Z2M4qJx7D4Ic1IB9gDK/oSgKDzXGS1worRzIu9eid/swmS2wVo4+rCdt35WL3fO+6n5aLs1SDzdRKtRnFz/SRg==","shasum":"efa3105cc785d42aa7d5cfe2b5b4a69523490cc9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-add-node-engine-aspect.20190826204955.tgz","fileCount":429,"unpackedSize":4434205,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZEbTCRA9TVsSAnZWagAArKAQAIqtbWF3I163ESxxrGat\nlc20OvbpFg/l+FXEIJH4cMfPHp2FsE9Y82y7Tyr5tMLkcB724eDqVXtrhkKs\nmg0uBHIvi2CkJpNF2hQ/hcd7TbZEEwc7CNp0W5R4588ztA7Njb4l4nDahlTR\n50m4d5qHfMPxPHDb3THKmNEQMBdNw0PvPq3w4E2/0syE5vHPVZiytUtdToCL\nCa1/UEpj2M1BhPu1amQo36swVFL6WyjFuwZodEniNyrgaKBdZxjfsMA81dc5\nJIkyo72mpBUXmrNQEXXj7c/F/UDghgqTLeP9Pqag36pppDo4tNv8qKgFWkqO\nOT9XBMjgiCuSTea1icafgYvsWoyu122AXMPW6VBhI2EM9N23+3iLaqf4Mn0k\nHhWTrxKyscm67rydpnvWl9OOKeDzKvDNwfspW1vsqIrg3AG0NtpCMvw84Kgv\nXf85MsWfUaq0HvYAeFOifRjwYi4ElWcZa8gwfKua5PJSyZoTeCK3V9jVqhGe\n3I7xyVMK1D4UkSxWClckQXkb5vDg2AiPogO3bmUI1DoROLOWgxAsbls3/V7k\nwrYAjdoLpOWIzssiHOsL6kwNzmowz8P+R8dFCdnjtdELx1yRkori/jAbalP5\nYayjTaDujIhgAW/+5wvlrxNthK14LKlfiUnVQUCPWDBc6/2QHWvpLQg32Vsb\n43Ln\r\n=fW6i\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAqvs4p5YaPb5hBggKvUto0B9+fRhs24BvzipN+CT77BAiBuBnmDtKjk8WlYwxbVn5wYGY3MKI9eH4N0Qr5S9tOUQg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-add-node-engine-aspect.20190826204955_1566852818822_0.41637755797032305"},"_hasShrinkwrap":false},"0.1.29-add-node-engine-aspect.20190826205831":{"name":"@atomist/org-visualizer","version":"0.1.29-add-node-engine-aspect.20190826205831","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/automation-client-ext-dashboard":"1.1.1-master.20190810154215","@atomist/automation-client-ext-humio":"^0.2.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.0","@atomist/sdm-pack-docker":"2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190822065724","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@octokit/rest":"^16.28.3","@types/js-yaml":"^3.12.1","@types/json-stable-stringify":"^1.0.32","@types/react":"^16.8.23","@types/react-dom":"^16.8.4","@types/yamljs":"^0.2.30","app-root-path":"^2.2.1","body-parser":"^1.19.0","cookie-parser":"^1.4.4","cors":"^2.8.5","d3":"^5.9.7","es6-promise-pool":"^2.5.0","express":"^4.17.1","express-auth-parser":"^0.1.2","express-handlebars":"^3.1.0","fs-extra":"^8.1.0","helmet":"^3.18.0","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","node-fetch":"^2.6.0","pg":"^7.11.0","react":"^16.8.6","react-dom":"^16.8.6","recursive-readdir":"^2.2.2","semver":"^6.3.0","serve-static":"^1.14.1","stringify-tree":"^1.0.2","swagger-ui-express":"^4.0.7","yamljs":"^0.3.0","yargs":"^13.2.4","zip-a-folder":"0.0.8"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/d3":"^5.7.2","@types/mocha":"^5.2.7","@types/pg":"^7.4.14","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3","webpack":"^4.37.0","webpack-cli":"^3.3.6"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts compile:pack","compile:ts":"tsc --project .","compile:pack":"webpack","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","spider":"npm run compile:ts && node ./lib/script/spider.js -o Azure-Samples -s cognitive"},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" hight=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nStart Postgres, connect to it, and run the [create.ddl](ddl/create.ddl) script to set up the database.\n\nIf you want to wipe out your data and start over, this will also accomplish that.\n\n```\n> psql\npsql> \\i ddl/create.ddl\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local --l /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/customize/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/customize/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](./docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"aa0568d3c5474f08ff6ebd4d74aaeda6cb66016d","_id":"@atomist/org-visualizer@0.1.29-add-node-engine-aspect.20190826205831","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-CaZuabKgRzlGcRxb+hMo947Q6TM5ddWIRVn7zEmybp1OcKR+9WUh4Ik7qJs70XMmkGtDFZeUCpk+h4rRj5DSyg==","shasum":"18c66f7cc3e21be374ca40b265c736f8a6723abc","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-0.1.29-add-node-engine-aspect.20190826205831.tgz","fileCount":429,"unpackedSize":4434298,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZEj9CRA9TVsSAnZWagAAaUgP/1JP3KJgkTa1dR8CN5pl\n+JNU1uBvJ7Q1nKewTemtS9MAcmCjhOHF24fxqwCK9luVSib/Zl9VDfAl6umW\nsD3ddz0jH4PiKld8ZCrmzA2gnye6c3LoZ8fp1ug93B+/Ma7Qp9TlSVLsm76/\n9pXNAHVrltLYrkOWkHtLJEPuKD1oIUDZTV3Dw2lkLQ6Iohjm2yJCr0jil74n\nNjyuurO6CSepLiL9aFtt0eK0H9Qa+MaZ64n6n6i1ommzaSCAkb2LrZBCeUbH\nSffV6mh84UzlNRkJoaMscbz/k7dDhEfbVjXmntTn0pddrZX2aO7v72557+xR\nGB3hnArZhaCji3+dqV2HtXfOa7qetUijSRhAMzhY/xz8MUAvAnETo6uq8n8/\nT4ij/xnpov9X7fjcxVOqPMmZdLWKehRqalArpE54eNzhzMIucMH3o07XTjWM\nCocc8qBlgc/rJKABxCFpPDjSv/ehAGMgEuR8QDtpZyLNHh4xjj+R4DHEliKu\nsQYj0aBTbiz79LYCCS8iaOPxDBKUAfX1vaaAqzuth7QOMJ4aVeOKlBeu9JXr\nlTRSozY5iEAkBTBXli11FCXGsf1PJ0hdy4U1Bz5LK64a20/yoFpuoqo0zUH2\niU2hVpKdBX3QsyQYTZviFnlwH0cz0Xsl8jxHWwQIJil+IK6b1JMKaU1tFGXb\nTYfr\r\n=7kjd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC0AQwnlek7+bqOwtYiy72q1hzxGzd6KoASTuHSoimUqAiAXyKn6bkByQVtzAAXHoJgO2IZnpDmzj75D/khkHqP2Ag=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_0.1.29-add-node-engine-aspect.20190826205831_1566853372545_0.299879550032772"},"_hasShrinkwrap":false},"1.0.0-master.20190826210245":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190826210245","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190826205249","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190826082455","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nBefore starting to use org-visualizer, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nIn order to clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local repositories --localDirectories /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"2caf635cb6ae758662eab9d4596a5d62d0ebb3c6","_id":"@atomist/org-visualizer@1.0.0-master.20190826210245","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-WlI1qjqFHrgORouwXiUtHYsMa7MUtJl5ick8OVTruKekUr7Mwry8oZrxVSSpsQdPbnYw5d8BOnlaqo1m6AO+YQ==","shasum":"9983c32ad3cf6e7a33265c6d290c62714427eff8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190826210245.tgz","fileCount":90,"unpackedSize":674205,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZEr3CRA9TVsSAnZWagAAKzsP/32FI4KbLTqARPTIPLwk\n1Wqapl6jC+TsTKweVI3d4oBYOrYc9yu73V9wmRzKKU5ee3I2+45bTasTljYc\nyJo2Z0gkLDexYebNtYyUzubh1e+psQX3D84LCIFNPa/KjFhcJFoQQRbQMDN5\n1msVtSKV0GFUoABL6F4AiyYIugC5QC3KGYt5++BEu6FLpi57ZG0kJw7MHIwr\noFqT23uG2Ch2FL9wpvYEwjOiQ4AI3+MZa5zvulJtFdBOyhZoZ2SDfRJI+eKw\nDTEfL7OLZLwBjX6yRudXwGtbyKsK+XVbvb2amWBP5uZojttEMtvep5JmLHZ1\nBBIpnlw1fXI67xT63ukPC4RYjysza7Ff+XZlGHtR9Lsn8eTLB2rBFTOi60q/\nO5iWrc4lzxFDeD5vVboOSXvKrRf25l9La3ZArsuzxEUmNswWvPtvl82ktXQj\nxR+8TxJfcjXldNUwFfhGOkUcdEEcL+cDD4sJMZxSx3y8GSCQ9X8yUmc8SzOT\nv0zqDp1bAXlnXta/HTfzGOh3IQfxbga+/8ML9dZs9N97xwld0oCJe5D8H/Ae\n2XsxBn/7N5G9VXdEYJ3BiYzss8emwKXA7ImeD5fiEO98KfN7N0rVDM6fX5XI\n9WuJdMFx4Houx4esiQ8nqUSJdN2j1eHL10w/qc8QyUr50lXbOcidW3Jghios\nwsha\r\n=e8+8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAPP1j9v9fjkCblzB6AS3Sv94Lher+8oIAAWQjDmi5b7AiEA5I8+gFnd/u8K0NQo7Yx5jyXVBqyBhEmmJn+N3MN4XT8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190826210245_1566853878878_0.9196710481344124"},"_hasShrinkwrap":false},"1.0.0-master.20190826220405":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190826220405","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190826205249","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190826082455","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nBefore starting to use org-visualizer, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nIn order to clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local repositories --localDirectories /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c0394290d8f8fea3e27f475711b5c6c931541011","_id":"@atomist/org-visualizer@1.0.0-master.20190826220405","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-nrlcm52iw49yMTtHWYeV38jzWhyvka7MA6Vds0BNLQhIuA2LpiCRYH/ZU3W7idt2+aEhES/dmOsqdq0CrkHk7w==","shasum":"b4fddf605b4b60d583b7ffd9841721432d3d3669","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190826220405.tgz","fileCount":98,"unpackedSize":682405,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZFmbCRA9TVsSAnZWagAACMEP/2SWbjVNXQGhMEp02GRP\nSW5eGl4NbW2CkIUvj3sSAtgFs2o86u6HRu+feO79+kRcahhOZKAn1TFAcpt5\nwhijP1N6+dQCwno+TvoAd5O56fykV23leawXqjK+DFiw0yPyo+15k/sZsKGu\nmdnKdNnHZkI3UYOWFh98cAacOwSME95fOFuZWJBqkpuLqyOw/OTEC1+FsOWW\niQh72qaKmYlPkN9EV6bQy7EFWmnvIV9RZaQ6EECMVMhqB9TsHp5nls1rwZQ+\nAxnfhSRLUgCNyhtbAJ2w3ULdneB3cxhptuKIEY6UF7kaeDfMkzPKQmCjOKxe\naLXqCCjXmYRxap7OUdpfgKaOfbwCH14pgFwQdGbWfoQYhKvv0X5PkzCozoxa\nOnmPVX08RhGu1bb3BAnib29t1cQmADij++7TyVKHVMP4bj1o7YRlW3W32Rot\nrv2Z22J8Yr/2a6rDVRL32HoR3lf3NoXYgDSWHaXPW4mZ0KFJqQRzZtlMzMZV\nmK6HYB2BxFiQBBWFvFA16FnmA4osvV/bK0fljHOVwF8/Z2FXvu0SoFGs0jeu\ny+TgF1wHt1xM19xtHYFBiYn+uzOJW8nm+nuzy+ew1VvCf+1ksVUqB8cTm8YO\ncbek7PMOH+yE94Iu8GO22JAtOy9T99GyDtzCix5ahzojSfMGY3cWRqW3JmMk\ni8rG\r\n=KjRI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIADe/Ky2Uo0eXpIO1l5TBU+9DglmSmD+2aj9CLQUufl9AiBxE+z3OESkasREFe8VB3ntti9OfgfggGogyn8PT6V0Cw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190826220405_1566857626820_0.8312065288032098"},"_hasShrinkwrap":false},"1.0.0-master.20190826230830":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190826230830","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190826205249","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190826082455","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nBefore starting to use org-visualizer, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nIn order to clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local repositories --localDirectories /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d0a73e8784ffbc191eb43ce2796a458656f879e3","_id":"@atomist/org-visualizer@1.0.0-master.20190826230830","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-dPMhKB5Blr0dcTK9wK43nzyQNSVqCYi7jndjTC4J/spg4pa8vu3yoFtByHIB0cQU9FgfN+khuw0mMMyEDrGUkw==","shasum":"d68bf37b0786504ba720a5e54e646e1347daeb6d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190826230830.tgz","fileCount":102,"unpackedSize":688216,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZGmCCRA9TVsSAnZWagAAGW8P/jLEWGmFMVDAcyrLiVQ1\ns4VnR6ksVbNzF66UIR9G8zV1mEOq6G3M55bXQ+kNVdTtyhPyq6wHN7LBahoi\n1jA1saquA50XL5hu+MVerzMfAZCe3wYhjogsG5Or6WYoAiXNtneQMKYop2EV\nIRlGU5m7NqUaQP5vb7K8p65DdgD/q4L3xTvqzt5JWs2OtnqIgV7LENlUBPRf\nUq3sj0WZ4mw9VH33UAFYSRzFgkoLve13qW19xeXmEuKUagftey9Gr7PDp1ts\nGw6hnQ3cWcFHpdvf1sNqdxbp3p5GIIoItnJ02wbf6a98oJG3xFZxpcwVeZyl\nVR2nVZSA7F+vf3l8gyx1BzDF72nyLAQ4/U6rwv3tkZ89PmdB5Xq7ga6jhZP2\nCiqpRWlRxkxhEUQw9qIOxsxsZZf42NyOeTCIp1SpCY/WeGc/pjkAcFqQlsvq\noJpwlE9zg++t03m1nheTgrli9cDljBnXgkVeM6/0XP8qajYYHXCZEHdafLxi\nGuEV17x/SMyKSiPiSnq2gryZJDXgen9UikLl2avoyrlfJaLO1nXUhfvt3YEv\nL5zBKU3hGOVvpmsYSXFpGxBO9sNgMrbvaczhKWugL8KQq1bL20qjgy1Q2dmX\n23TWRlAf7178JWR04Oj1dp9tsKk8UH+tvMCFVsu1hBb0EqypG7cyyuaJ3mTh\nWpsP\r\n=nk14\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICqkbmPLLBnRSAKu6/BQegm23HSLq3dzPWw9YtzJrec2AiEAwN7QvIrxxxiHQ0U5AKlB+rStsdQaXGeWWAMxRdWqXg8="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190826230830_1566861697947_0.979384812572442"},"_hasShrinkwrap":false},"1.0.0-rj-manual-tag.20190827004235":{"name":"@atomist/org-visualizer","version":"1.0.0-rj-manual-tag.20190827004235","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190826205249","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190826082455","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nBefore starting to use org-visualizer, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nIn order to clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local repositories --localDirectories /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"a07e48745500a72f889b7f0f527ac420fc800d41","_id":"@atomist/org-visualizer@1.0.0-rj-manual-tag.20190827004235","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-w1qF2RYbTr47NuCKVICGf5biFkOV1SL+RTmj8mfiPLQwbvEYOwiswWFtp7fcYG4lu9z/n2/q5eNeyOLwOxHAow==","shasum":"1e586bd84b70d6ce8724ef0cc026e77c43966f63","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-rj-manual-tag.20190827004235.tgz","fileCount":102,"unpackedSize":692465,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZH2tCRA9TVsSAnZWagAA6twQAIXoN77kWkWxp7s767DJ\nBKovOnv+FpPfRncGlyR9QLrMrjE4ziv0Nrwx4KWwtCsY9DyVAWJ2+Lf3LqY3\nyaEKB2kqI/fVLZLAnuuVWNhEfd2imwx5Uvzu9E+B6SAIpF4HVyCY4gK0PwHt\npKIADZMIbF8H/yZWOgwdiXoIrRuu3Oq8aSNU7hnNcQ3DvGCleQ3FMhbLQwuF\nJ05R0N9OHK4oCPAA8Gzf/iDK1WFrntjb5xP1hIsUzm+DhikpsSrQbN1pyyaH\nJQAuDhWvPdsLObSNy05aol9alXhy10Xf5SxIKjTYZyjMCnVyBLYP3N/b3OiE\nsiPJrDoWkb7pfgbTXwhNlO02MNTx8XZqxmfKDK6rP1UkaJz8DnY/feA/Omw+\n9c6reoXj7grQ0rX/OsvN1zaoXfdVml2tstvNE6fWPvwIkJz0bBr3Pj5G/qMO\nU1oCd+Xg25nUnzPxnlozquXMNpRqzsA8G3+TN9Vnu9yXwtTf4rzx0xOHFtAC\naSDG97vy88n8UKDkuelNwX0+uz4aBhm3tw66Ivqn4TVXunjq7m78Q+yx6pyD\nChbcXvQvXoz/y79eriTQbDSH8n4pfoZehgqu/ypxnzucIBV9h37Enresnc+T\ncqy5ursAT10IN5EYNNgavhqZrjj1ozfD/emJp9Le1hDY4UfzjET5UBatS5Sw\n/Ek9\r\n=adxf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDGnNP5a7TY7ZVJsuODAjpSkzaT5sx/bcxyeFeqgsq4oQIhAPNwMA/uc9x2prEb4352KUcEFli5i3IfGModKBEBkkAa"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-rj-manual-tag.20190827004235_1566866860370_0.6649781632619296"},"_hasShrinkwrap":false},"1.0.0-master.20190827004537":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190827004537","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190826205249","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190826082455","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nBefore starting to use org-visualizer, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nIn order to clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local repositories --localDirectories /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5ab30a137f7fd218f93b42a0e849eea667ba617c","_id":"@atomist/org-visualizer@1.0.0-master.20190827004537","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-txCMnZS2zOnHa4YhHjSbNlqu8ecMT3ZOvinODApoi9MS4ZHN9ZzeDSQJFg2np4FCbczRCgpIoELcjDkACK92fA==","shasum":"d5cec77de8ed68b51f2c2ffe9e8bf818e9376a85","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190827004537.tgz","fileCount":98,"unpackedSize":682323,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZIAFCRA9TVsSAnZWagAABGEP/3oZzpbIg3ncF3BHfsk5\ngVEED3HIsQ+i8VOs6+TwjskLJIHpvJkIXhogQL4C2XGQVo/YxAJ2S56CvvpG\nJuatLpdbXJ0kNlUhrkDM/at5uq5QCE1nCDExzuYJOCQWy4veGmOM6bsQcJyR\nKSx1dR3lgrLrFIYQtdxxpZ94b+3TbOEn8tBuo0ctgCGQPUlK2HElRuENEpOH\nKaFsI+HJr3TImWEXKfq0cBNEIugYadZnvSJ5mAbfxkphgHU375y94+Janpqn\n+6daRBA2d7l4kXMDYHGwtvrPKiHERRvjOZ6kHWjWYO8faoK0Y5ktGPEbguM+\nzwLWpoMakaUyeprLaEh7lSIZSbc+AggSnntx1O+l0bbBnsLQOXOJPyEpji2i\ntW6GzG29JVoUY2SVgLWdLL9KxUZ561TUZuobnyA4u5NEfrrn+hWf65ZdG0Gb\nJM9wMs3ZbOpZijimLjuiDbw6/oJWXxcNBrkfuR5xpMj07MGiHE/TkTm9cI3y\n8rQsFmUQh185xIHsvs0wNTwoF9K/qayT8j3Ywe8XSC2Ku6CZ3vrWJjUoFU9s\nsWCDGXYWpcO1HwIRdK0RrQBG4FxmZKE/JRRx2fojDt3AOCOs9snDQxvJOm60\nOoOT9+BKiw54lAO9ol4xDxQTyuyCrrmkHVyXbwrvpq2tHQJry84Ra/2pEKmJ\nHGXk\r\n=H+5Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGrZg1kreJ02V7hsCbTnjzzg1JSmnpsUZ5y01ZXH30d+AiBgC84/oIA0jhIy8xoYbl0bYqyzGiiP9PRuj6M6mfivZA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190827004537_1566867460939_0.7584541334636135"},"_hasShrinkwrap":false},"1.0.0-master.20190827171613":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190827171613","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190827134420","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827163810","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nBefore starting to use org-visualizer, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nIn order to clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local repositories --localDirectories /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"89dec4c132ffcc99272b8748a56644c1e0e068ae","_id":"@atomist/org-visualizer@1.0.0-master.20190827171613","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-ElvXi6GS4/XofKqZMp5eT59/q3gPAatzLKGFOsIddhmNwA2iq9Z2cm1BRPPfjkX/PuAUE+f0g8A9uvHWGoXg1Q==","shasum":"5dae47f6f769b71572b2104f8e2005978ae89d80","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190827171613.tgz","fileCount":98,"unpackedSize":682433,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZWeoCRA9TVsSAnZWagAAYUQQAJUox0uSOu1rMn403nXY\nbxrUXrXXro53fT1UXNoR5wSRsiO3aY/QTLQy7e1IrqifGowQrWQANe4kXlkG\nT7NEL3pg775/x1mpqXdmTB6eQIQaCSiNPLT+bPYYZbOzngNr8YsVRp1UalTL\n6HRG9NncpdQqSirwx4QCTblM/7BGaaE0bByImmrnjYLl5/5V522CGXWf8BMY\nlIlx0nYd6vYQwJmsEAvidsoCU0XWN3bM3LKvQAT6E+J+qnEY9t4KXiS6NgPD\nWCb2pTpMnmnhYMElCuknZ2p6POka9XyL88tUWKa0K2FooAWXUAXhRNx9BIqD\nam4A8kXoWT43aEXgRfGQBHXgUH7LKcsQeHH/u50nzyc2hH8q9hMoJ9Kllc7L\n1bcH5oEq9HAcfTc5t9jh9s3HjwAk42wru9KuhBCWuOc1AkZEa41++5SD+u8Z\nG67PkjlFe1mhstjIpRxET9fAwdYbnPh1u07cnouoRnkyJl0gCdNKWz4XvtYk\nwSve7i2kd94BH9YlHPb1cUL+n99PxBmjyA+7UrlwYyg3/mT+XB6My4TRsicp\n1RPQHYINoso3tHpCWTVl9G2gdfplTJF1Qh8cvi1z0R4OJy8FxTyvvq0RFd+d\nH8WMBy51JpZM3u4fcN57yEVv3OzAWQ9XhICleWSVcqsBIIl2IgKKDUbc7PUU\n1vXr\r\n=Rczw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCmrZXqUcY7MTkOH5L11r6gZyNUnd2iO6Kob0NTJT/QWQIgVCupP4CUn60AWKmItWe/dKxZuAG6ADBkKPaz9QnA3TY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190827171613_1566926759918_0.005614724257340997"},"_hasShrinkwrap":false},"1.0.0-master.20190827181459":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190827181459","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190827134420","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827163810","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nBefore starting to use org-visualizer, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nIn order to clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local repositories --localDirectories /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"afc0052d67e9535fa041ae7237e8a18848bebb70","_id":"@atomist/org-visualizer@1.0.0-master.20190827181459","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-M4godGBF4ksnLWn6H86BpvMoW/ujO95tRuQbbs86KbEVR0+Y4yKA/ygujCeiNJ/c/V4fRnD1B5Zj8GZSwRLg4Q==","shasum":"8871d458aea4b3b8dd7d968faf72444754d0917a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190827181459.tgz","fileCount":98,"unpackedSize":682366,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZXXpCRA9TVsSAnZWagAAqbAQAInnpRf3GeyU7655GJym\n3D+ZKF9yxsNOrrRgfjUw+JkwR21of5sgw+ImD1WpcuWtdBKRMm0gNWpA1x9c\n19mwQPRio4RSQxCZN7jx7loc0AwKAALPQQ55OfPaWq3B8TvD2iQQvKbkR/Vz\nD0irRG+WlQoZtwj44hTfVGmq9GV9X+v4cSI2GSqJ1+eyj4zsS5VJgQkEMOlw\nw9hwwYQsgdna/PMg/pKW4ES0kEU9K5jjsdGZSWfb/ZIuHymOtzO1f50FS6o1\nJXcunIN0dqLCsHdwLf16cZLbv8NDGwcIu0wlaBtStlT01MhFoZ4GMggpWnlZ\n+Ut99XSlmY3er2tK3YlfkR08XrFdKB8pLP9r7QkHDeNP9yvmiEQyn2AqmSCa\nq7lJO8jG74V25dGtGokldzUwfcKBC6I0APtyCaTbbsIPZJp3ptOYQFJHk8Is\nMO2HXtkgwMttuoznvCFp/CIB8JsXmaAhudURss+8WZQT1+pyooYaCE3+4WHL\nTNwCLDI5t4bDT5fu33mn9JrvM0Ci2v5lNGvFDxGr8VrBpaz758YkEjH29nd8\nH7n6Cx2pmU6OCQ+nbP4Kl/2mu7w8zcY1CqMuZUxt4qAHuYlul3elTxsvCXZq\nZYQzroV8zy2MM8hSg2beq9FoxpZ2BOLoca6JRUHTGPPLsChF29EEf9PI6oo6\nmOjR\r\n=uPsD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCkTpWpTcsL9gNu5ZLZ8vtCg6psYw6mzVXSNWVzUzi84QIgY+HeyLd8jIMtgX0rBoHL95QT5qm+yg7jE6KgnHlFbhI="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190827181459_1566930408957_0.4617755098431102"},"_hasShrinkwrap":false},"1.0.0-master.20190827224748":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190827224748","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190827220109","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827220717","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blog [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) for further discussion.\n\nAn Atomist **aspect** captures a concern in your project, in anything available from git: repository content (code and configuration) and git data such as branch counts and committer activity. Aspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an \"ideal\" state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing the Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspects will result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your org:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Run the `org-visualizer`\n4. Run analysis on your repositories\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about each repository is stored locally in a PostgreSQL database.\n\nBefore starting to use org-visualizer, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nIn order to clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default Postgres [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the Postgres database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n All artifacts referenced in Maven or Node projects must be accessible when the analysis runs.\n You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\n>You can start quickly by loading data from four open source organizations by running the script `load-demo-data.sh`.\n\nThe `analyze` command is part of this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n`atomist analyze github repositories`\n\nEnter the GitHub owner name (e.g., 'atomist') at the prompt.\n\nWhen prompted for a query, hit enter to skip.\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\natomist analyze local repositories --localDirectories /Users/rodjohnson/atomist/projects/spring-team/\n```\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See Extending below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Architecture\n\nThere are four architectural layers:\n\n1. **Analysis**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or, in regular use, by an [Atomist SDM](https://github.com/atomist/sdm).\n2. **Query** functionality.\n3. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n4. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4c21d201f1fc16d6157fbf6d03ff1d6e23799e23","_id":"@atomist/org-visualizer@1.0.0-master.20190827224748","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-5PELsgONsYXIEIxhptbfsFG4r7UbIQxWTqmzUFyrqwlcpdox4DQcAecGnyRnxuShmQjsd9/G7SX0XBjdIikC+w==","shasum":"0c479926d242cabdecc792f0907320d9e0ed241d","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190827224748.tgz","fileCount":102,"unpackedSize":695673,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZbXYCRA9TVsSAnZWagAAYIEP/28IidWzWB3dX0b5yRld\nSfpNBkHybkKe1MDaQwj3RCkr84DIQIEU62InJfGPeN3p96eFS5tHAEw1ZsRn\nWKOFZZELCcy2CgFIVZOQlCpkktkwaKJ6o0Jcjo1uTzmVz7la70qI4W7I5wCv\nMGVJNreIcjAdGvFymBw3/xojWqhvAWfnLKm//wm2+XXwD7ylHWGrFA3FoRoh\nOYH1acWnly3yA2nah8FMsPLDZr9MM27Qxwjv//uVYygG3tnAUYVY55dYOrry\nkPNlT51+EmE4QSGInalCF9v6QcPvMcOOLrdk5KZINGxnQOH+59J4BkLJm3eg\n3anksLwZSffyCwbpSIJx7//FTJrxBpglqkDN57C90TDEg0CdL0KEHj6hHahK\ngIWAQeEDUIhUMMwRR1nJCRT4YfL2TfuR0Oq7jR2OtnIpdB9hGwTZbhn6jhyL\n6JNWfFKE+SxAA6PyY0pTFpYc+uw0ssywbCLDa0ZpC+KNscWYN9Ubv+LbYEXh\nqP1B4QfuzguKgbY0jRe1i39U8PBnXInuTA5UgYJmDFuo7F9Mb6PIV+uX5VW3\n1yls4D3JWD+fgWcjv34WFlS6PObw4xTi5tP8OU1Rdw8++8e2sIrly3A53dMJ\nIklQSYMTN1ls6zRsmKxl0BIWi2PMQQwSI/PVble4tBBhItAJwX5CJPlPWwej\n/UCk\r\n=7bJG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC+4UzXSjDPwNXDb5hjHu7pbUX1x/cLjKug2ZBizqjZ1AiA54pdjnSft9YA3UYHLSFB9NV63RKnHRW6YX7EPlALPew=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190827224748_1566946776231_0.680954773121415"},"_hasShrinkwrap":false},"1.0.0-master.20190828005416":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190828005416","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190827220109","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827220717","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0).\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3d98dc12adcddcc19957de685883b4d6d1464469","_id":"@atomist/org-visualizer@1.0.0-master.20190828005416","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-FH1F7uf4x95+KVCsWydLxeGFfR0CQg0Qe2hyqYLJleSVaP+SGnVwozXo5817VbC3M5JRh2Bm7QnYDUaeccwhqA==","shasum":"61c1c55b27681f1ebb4a4d4e5bb30ecadcae63d9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190828005416.tgz","fileCount":102,"unpackedSize":698454,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZdPyCRA9TVsSAnZWagAAyPYP/3pWYNGvMK5xxZn9+xWJ\nNjV0Nv9N0kbp99mcid98ZqCb5a2CxiztENrqkWqYFEW08bP75YsxFOQKrps2\nUw4jSQuHFod3+NKBrs1c6OKbm6gRo1IQjGnQKflf/Twkf9UbnvLzxgZjbqHT\nTRBfN4cAkD65xdorYM0qmFT8eYkx+sRl1ioZ7/Xz/PpDwC+00fCQGzdmARtM\ndM4iuwbUxoc87oW3Rd+pRkvgHmd6754SGmDV2AWanLjViElsHGmcur4TvpTD\nfzj/sqpUaDasAg5WjMu4zSK9wTm3YmR8acWjwXnzE+v3b9bYR7LzQSaDvCH+\niXSXahkyikmMAMYZP7cup5bpmyvfvRGX4Okx3GVAShO9yJq3t0rUWNLlgpQQ\n/XHLJmueYsvTDeKVZlMxyvoVzXBNu6uVbvVcR/W2B/NnX98J5u9YAXFBbPpz\n/fEAvX2Xc2WtTE4/vIHrLNFegs26+ePyp0G120QpP+qdWRMhTN2H+djJUJYj\nXkJtgznMNsTEYEa0Z3vOZDyj/Gq/L1mmRDXlPj89nJe/gktBlWi9+2B9vWCr\nG8BU0WApc4g+bqZU+ANmMXrDJc+zyXqIoaYoA48iFna+wxQRYC+noevS9SVa\nn2H+cgIJ7b+T0Fk5RuxFK80fQ/0Axr9dp93XVkwsPeUKZm9+OR8Hfjr4W5gO\njm0z\r\n=YvGw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCdpfPJddBuq8I+oV3g+N25GRc/A2OLMYTZRLcYUVMDXwIgRh6PPZROOS6xoRqNB+OWEZUcP2ehmqNilzG74phSlrk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190828005416_1566954482201_0.7195785992089536"},"_hasShrinkwrap":false},"1.0.0-master.20190828015514":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190828015514","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190828014024","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827220717","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"400f45a9f589075b1d9927a63c559705d2f878a5","_id":"@atomist/org-visualizer@1.0.0-master.20190828015514","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-jliX3i3rHWaJ7DM8dNexMx3iDAN7nDWPTMM2ol8gQ5714R372hHi5XDf+QPC51MR3P8Hr89jG+IaNL/7f8RjlA==","shasum":"2737d91cb3204714ad74363023fc936e618656b5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190828015514.tgz","fileCount":102,"unpackedSize":698951,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZeHnCRA9TVsSAnZWagAAYsEP/iz7+Toi53AVttMOixRp\nDHM2MoT4ZW7+Uau4SZGv62yYfZ9Ml0pcDHwAZd73y5vCboIC4dXbHgdZvPuM\nHaMkcdtdg+R1RfO5MMMND0OrWG83PK6ZD9/tOqy9wI10SUSru7MrDhYKHcZA\nc1k8m6lsg9+lCaZHP+ba2V1f9jz6951RMfq7IhMg6HTTHEnyXjmSLLIlH9qD\nANFq1FLgzDJuohB4JV00cUbuTD+epH4o/GHZe3B06Rmg+9Pjl0rE5ZGKdNuk\ndBI59A8PBH+4uZd41p8PP8b6trxDeQFKY9FdJpW8d7kk+DBwdiS/rKBTRxF1\nNgGU4JKZp5Mju+KkX75U62k0Ghy2+2KPcR95asyLkHzkWRUWDXFg4vQwHgUF\n90bJWiAFAenZSm+oTTD+wsjWhbzAd68KIQQ0tEOXnyBfghBryCWfE5gxcQrd\n7VPFh5zHsih3/2Bzko1QSJPeDKQlFsjUG23pq2PmEA/w1jDGNZzxRmDpDCdS\nKD4a/5lA9ruAsRnPGxy6zMXxyDj6i8lz08D+YKJ/O5MoaZSuejltwvGHFZgL\n+Ly7iFySw52i67wfHPe3dbv7brIJXJNXHvYhAuz+/K2EIzrn4WuhvN1QIM4y\nPngEOW6VIimC0Qz1gFK6/gkcffRXinXkZ9Yi6cnAoouSxhg8SR8Yb381q9e9\nraHk\r\n=UqwF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDv2WCYdJZYWRmcgOkyYQd4Y4C0mOrgCCFI8FBlEqy8igIgSlgZxnXUCdf5/nT4icMvSnPVXnRsgIYyVoj6viLB7/E="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190828015514_1566958054842_0.28331501085523514"},"_hasShrinkwrap":false},"1.0.0-master.20190828021523":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190828021523","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190828014024","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827220717","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f9d047e83e71c14a4151142a8d8051d60fb66536","_id":"@atomist/org-visualizer@1.0.0-master.20190828021523","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-ukpf4gPsayg9PB36X3afQAYYHzxvQqcXNqlXUhpJy7pufUiVJQp51zNpM8KpUDS7fzLbHOHqr6IWxB28M6PUVw==","shasum":"ae86c46502662564c6dcd421e394734f84ff4b2a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190828021523.tgz","fileCount":106,"unpackedSize":703631,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZeWzCRA9TVsSAnZWagAAbN0QAKT6bN8Rjoa7XGqx+n3d\naA7fyKdx9scZaZ9RN3TJHQfW2p6R03jSNVvWteCqTkYleG6tkPxb0PE/LBQb\naACnYywLSX2j3b1QZvdxw0EbuJzKOAPYfxpw790Q4G2m+vz9Siu+JAqinsWW\n9td8DgAhIRuWMrZj8Qg9nELw6lZyA/1TtZ9Xqu2HvlddAqDBuxz2idPkOaJT\np9th+7a65+qpHwNKK6/cUEPAhv+NVm413p7oMwRhGeiTuo2lR0NzI8x8IajE\n8vMgctV6eKNLZomUBaQTYXO+jJfoWSglmtTCCTUnSfy0FB9Vg0orfS5VhLT8\nur2kdU7brZJEQEtS+7MSkz/D2NaiQZhzDxoYuCeMG56EKShBiFdY+xiYQNbX\nPaQcjUGx2YLZn+m8edK0PWxiiC+5JZaNawnooeis/bbV3ziSO0knspaIGqb/\niqiBVqv6vSYLUfcPCR+FwNQ42unciE+2rvAf4j0X20LDZwKMblKEegfXamg5\nj+o5qSjU2ocf1x8ppHwYGn05sP+e7t0ueybj53WJJnp/Jh5YO5GknzD791BH\n6WyiR09exL1emXWNi07ic5Fm9PQPauP3aVFAQ9MlRu1lgQIx+fzJiqsUiIZA\n7TV5ntvao4n+OcOUpbuk8xkCOeQG4s9hJITj7yofAa61jVWIOXrCMDbXEyR7\nFEEU\r\n=erxW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIESgrLopGCB9Dgly+yt2S+ph0ioqrWovL1APsKCrPU8zAiEAkj6I2i+OECk5PvtcWEZFAOGY3Cu1hkGO2F/XSepwLPM="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190828021523_1566959026353_0.22855092683481448"},"_hasShrinkwrap":false},"1.0.0-master.20190828121131":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190828121131","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190828014024","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827220717","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c076a6d734b51ce4f18830a50c1e4b986a3a0ed6","_id":"@atomist/org-visualizer@1.0.0-master.20190828121131","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-dESmlmlKFGmn+OuShTYGQ3U3nrVC0bumai00cFos17gyugoKKMjPWqkVyQjqYWk9juiBflY47t9Izf4ub0V2Ng==","shasum":"c0d55e4302ef040100e6a58c852c73064cb2f54e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190828121131.tgz","fileCount":106,"unpackedSize":703474,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZnG3CRA9TVsSAnZWagAABj0P/Aoy947Nw42Z4yN8IFsK\nCm/BZem+b1SMJN5dL1EiGACsthWGo6HDPV18SxufNLYyq21clOSqlISV5dip\nSPAiRw5GCdmM2bAJaY1HnnVCyj4qDAeZYdnudJ/oL1XuSzIpbAGHYCaYi7p6\ntnuw1PjouJkonVX4py7+kSq5EjoTW0nWqOSoZmPDNJWtBGhXaS4k7sKzXClz\nHEhtQLdrAibI/815jY5XCtwM9E4DGrl6382NdnLjEZRX+2VYPCj1B6eGs34f\nr/NVHMWupmN16HthDKXYr8sZwG1HOoam3HjmN5VLpsqnFjgMG3vVxK6lG1Kq\nLN8Y8SMD/fix4p0V/PDneO0nWlY90sKl1bBIo6x9nn0Otbuw7xsvuhwWt7Z6\nT63iXAARifJ2oVfmj5Ou/wR9Et5EZ4/q9RbAHY77qitOrJsheRpcdFNhgsKn\nLOkdAaq/T3E1hHXa3L+bawcAbYnphrSSNGChkORxBzkbMP11DgcrsaEY/s6M\n6AS4G2Nhm3KuWCIjn4IyrCGpBb9AiRuDKlEMXcEFVpB19utbXaUuXOOIw7sZ\nhyA5mR4nKOAQzlRU2kB01pU4e/BJTpWcIn3O7SzH9ac2n0h+jvawXL0F7l/q\ndEP7LrUtg7yNZkc9xw3wfSXIsp4uBgY3niQxruYXDRwmHTPLGJJRIykr6dBc\nRHnm\r\n=z6v/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDytlpeUmLvYkRvdHBKDtaYTj9ghRF+LB3DrcGx7r5+VAIhAJwBNS4kbWlW5716AE80EMo6jLbzGioWsIWIkLFNkdYa"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190828121131_1566994870814_0.4179573975150688"},"_hasShrinkwrap":false},"1.0.0-atomist.npm-project-deps.master.20190828130100":{"name":"@atomist/org-visualizer","version":"1.0.0-atomist.npm-project-deps.master.20190828130100","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"^1.6.1","@atomist/sdm-pack-aspect":"^1.0.0-master.20190828014024","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827220717","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c22b36846f3ef97419cceb0051b47ffbfd041ee5","_id":"@atomist/org-visualizer@1.0.0-atomist.npm-project-deps.master.20190828130100","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-vkA0lQrOG2MvacSPJQwT3Bh/wvs/5dt6OKYDdok0v5IIQLAIt001PYKziaoayzG/RIoYWDV3aV9XtZwz1LgQwA==","shasum":"1600a1bcffe70d507b8af21753277005cbff1a85","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-atomist.npm-project-deps.master.20190828130100.tgz","fileCount":106,"unpackedSize":703503,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZnw3CRA9TVsSAnZWagAAJ+wP/1Vcx6cNuBjzhR2qf6YW\nz6c6kfJyuTpIWXGfwNB13zmj0pg4nM7xzu35FIg3KEaDZbHa6O32Ku69q3V5\nzkNrTJn8VbZ/bAxHothduP99PYZb4CI5haFhDnRk75L5iPzSnsZKzocCAtKV\nJXLjXGR2ea+DZ0RMvVgrX5viV+246gZk9RKf8GXGcg+63CclmLOIniRHSk+K\nvCyvGZLKsTtuoOmmwHmIctq6381MM9J3JInIqGJeSTIxWyp4dkqInTJUw+Pf\nICG0ugs1IOJfQvb9l60WWUrt6Swl1KhDC70toLi+ZvfPITA20ITPy3eA6Zgi\n4FeNpbUDqbp7/lYgwWHtnx8OqFiUflrNt+FoII7Ru72+xhugrx2+zc3hl8V4\nZJiRt2KTeLRLsvUpayirxr1yID3qes0vFTF4vW/FXExIJFfzWh80TbGPxESl\nX4xgOS8S9TQN0owwzU9eWV6k3Di7TL0nmy2vQ/bDLxLKTypKgZd1l2NUoolG\nyRcbxM5wC7Ku+piR3az8ZvElEI/nPzWj6svkzXm1N7slqmAMaEcUMf7gxAKa\ng2gOePWa7kop21jeeg6vvWkyrkpvl+Up6SqL9ybN2cNmA8V7y3GH6Ocn8vgQ\n8dEZYTNgVVYpn7sig4Psv0yU9GzT2vzy4wMFCHZIS51J2do0lRP6R2Hhfznw\nWdOb\r\n=Vsn3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFBRPxmFKpE/VCAsFXYke0hOpGijsjqsiIN9rCKe94PiAiAyaNrLqNFuC75OfLItiQA1VG66o5H/EZEYOv5E7B/Glw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-atomist.npm-project-deps.master.20190828130100_1566997557982_0.2632814575496485"},"_hasShrinkwrap":false},"1.0.0-master.20190828183537":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190828183537","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190828175951","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827220717","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5eb100787c82a26ebaeeec6feb6e15ab5e27dd1a","_id":"@atomist/org-visualizer@1.0.0-master.20190828183537","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-fNzdCWeg2BTTYreBU86VkmdTwK5szvwN1rXDkHXIcFmrgAjY3vL0CmUEAQjnb7ZJF1pdRxnnCjpr6/iAbqemFA==","shasum":"cfd1a4b94cfccca41f90ee6f3e1cb1a40b1883f4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190828183537.tgz","fileCount":106,"unpackedSize":703522,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZs08CRA9TVsSAnZWagAAuwMP/2Xmr3UFo7HLonprxA5m\nM5O0C0B/CO/5sPeRsTQvalY2fSS0NnwxJGfFHcKN+7cNsmQAdezXmBotJCWz\nuz045HW+livu3uZfsO0/UXgJtpd/bZRfkvCAV43+7RPOLujyXS21xfDKfJMN\n4kp7Hba9VuinMVXOyPPPCs1QlgtdIz/rFSXhAvSE4awyOJ3c6X82s+4xFge3\nt7TS1Q+TJj88/6eJL1pMAo8n1ASDIfJh04KvAMNHeDtd+DTOZRlP29XgG90u\nkeXK/IqRqLnOwuCAs0/OlPQtGy2Ac+/UhjQQIeqxw9rhnXyj9JFcSRJVs+Fw\nfgt9HHZm8PIxzYNz+LdWEapNxdElWOwSXSPhAEDdV/NDbWNFbPUpjkd/8m7U\nqGCAIkvzoPsagYtQh6GlR8ug7C7xtGNXKiX76C9iChNJHhXGCRyDFrQcxjrj\njLEMkk7B//5Mi3gSBrWL/C9fk97RSMAnLbaYGjAMGgz1hc40hOljFsmybMSN\n3hUnZIB7MaKDEJPWU9rkiQwSyQJg4OI3bIybHPh5ftunW3+9VhFG9X9d2GvP\n3gUDUTIBpFcpM6F2q5s4T8qzF8fuaDTU++B+E0aMvRCahgC1FKaUDFTbhFeJ\np08YYwwrnNA5CeV5uDlrumsNx6o12nHnHHn9i2cu0aLaCzRkyJ0GYo2c0ybN\n9x5W\r\n=l1u3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCoTUUNKpXons9/jo/mkmw1BDCDbUrGUbjRTD31+TAsjgIhAL0yF76Axuz9bP+X+UBCvoJPlEmPr/ekcChwrLs4InjH"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190828183537_1567018299342_0.773100305661182"},"_hasShrinkwrap":false},"1.0.0-master.20190828190653":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190828190653","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190828175951","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827220717","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"211ff7dc6ecc33cc2a1e5eff1a032bbfb1828313","_id":"@atomist/org-visualizer@1.0.0-master.20190828190653","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-8VOXYi5qBAghqtg5P9MAqNsi7pxEJE1EvQbZkowRSQh3vyf/dqQYP5d1eEsT/+jd2DTqSs9om6/AdoQyK+PlOA==","shasum":"f5a32818c0f4e2ccf9281b767f32848516058793","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190828190653.tgz","fileCount":110,"unpackedSize":706034,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZtQaCRA9TVsSAnZWagAAARwP/2g/vdkUnKLlcSLtoC9j\nrwKxtl5IVK5hP/xZ6uHCzkVsTRxP3iNQYTlr63uHC9kkFdl4rWNXIH1kiJgf\nvEztNWBkB+gRV62TEA/ulyaX1cQAh0pUrGrqZl+r6XTRfopA1g5BDh2FJvo5\n24E2+F9CSQevjNHqHh7NbDTioGuqNjZ5/zZ2wJ/H2MI0wpDjYpCdfoVFhKSR\nmf3ph02Hvfe4mVyz/ysomQvAuJ/pNJ/QAz2OIzYpFh3ADfiHxoHJEn18KjvU\naI5noFEwZdamLm1m26cMP/qXmdFFnykNG5qqqBmKUYSWDelloDZUxVX3mV8d\niA3+NAAFnwEZfwHRvEhvrvVXAmbbYPnw1UWmg4X4seN0n8LtQ87h+4JopmHu\nsAX3C34Qv+DudHNRNVMpoMpcg0e4NECz5kn5oJz2WpKZeM1SXRySHw4ShCXt\nMOBXDoLmrquvbviytUg8wFzjWBU0jwOF+uGAdsXfk867xLdeWMKNEHPg5j+U\n7UHSAEGWegLeSDOWp6wX0vmaYcNlx3RGDzH+jOmH7twVRYJEzPVqQO6GQ2k/\nUX5ObDDU7O5lRGY5oGzf0JdeSrNbJenM6+qbVhwKbT8ii9nMiKsXIw5xp2Ix\nWaicT7v8pGTp4DwL11uN3nfbMlq6BDqFe4si56VJMtG3eANQqudpZNuL65hz\nfWIv\r\n=5SNh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJzCXdDqEDC+W2YZDSPiYahVCex2ZWJF1Jut04kt3nrgIhAMfU9dO+WIKp3ZpgH2/HRLHTBhpAw5p8qBRVSG6lcFdO"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190828190653_1567020058147_0.035487117169806126"},"_hasShrinkwrap":false},"1.0.0-master.20190828224526":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190828224526","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190828223407","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827220717","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"3ab504786fce288a63a89ab0fc86b23142370d91","_id":"@atomist/org-visualizer@1.0.0-master.20190828224526","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-M3WxOA66WTwAwdWvprjTEHTOcPsBI7TvITjt2NEGlSbZ3ZMpjA6QaPpX56SjzMK/Eel5IRiH2IwbUhP+gPilGQ==","shasum":"99a857b5732a02de06b36ccb6da5dedc8bed51be","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190828224526.tgz","fileCount":114,"unpackedSize":713555,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdZwhnCRA9TVsSAnZWagAAj3MP/2t+PQVY3iX+fIbJYA4H\n1aPJXl7IItp5q0K6iS9dbCvh2hOkL7VNCJiUMV2l+HHYEsJRpkV5ZUbLFNpR\nvJeLTavc9YNMkP6zQDcNwmAbHgDz2qkba1yvoGPGaHang1keUR1KrFQXpmy9\nvV04nGDSzs5cbdNagTz9doOBNerHJVXP7lRHt67QQk0V0BnDDHFzHqHsprm5\niVnt0S8cC/LOV2+TWJHvPCzVe2GYautfkq/7ebx1d1LA19gwQ3orgqBPBDYE\nbmo1kVIcOdOlGQ3XvCHuSs3HXqtAu+8ENdF2TnO1C8u0wMPbMWTpwqOxdZZl\nsQ80mdfH4cYEYml4u0nNzi4RsiCJMWyz4EMDruL7wzlPr8gPGqFwEum/9vQa\n+u9V//Nj+sRDLC3USoJ/jnQ8wVVaODNUPC4DEua/QiKg/QyKQ7ECQD0bMuzf\nx0cAnwVC6DaoT40ceP1CHo9Bian4NSLV5VQ3lrX9ftSlnMDilqdEg6t8eB7D\nmuK178zo6qvasBi0p8wupuCDq7elTeNCw/MAkA3Hj0DHsyIlQQ6f618c/K0R\nbWD46PDZNxL2O1ahPCcn1sYcLNEAnd5qb4qasUhM4YLdwE4YhWJPtCiBnSgR\nFZ+rH6ydZrkoViheeDXeMkXiFkzDvYLPrEaKOZiuFevYQcRQqOeXIPVQxuJ6\nAEo8\r\n=bPcY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDLvoiD9RWIR1W9UTDLKLcdaAPSyq+7+XHN2JARm1+elQIhALzgGUxgA1nZ4FvA8uaJg0c35eXBaNkghRNlkiHVhRqy"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190828224526_1567033446197_0.6290298001606105"},"_hasShrinkwrap":false},"1.0.0-master.20190830023725":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190830023725","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-tag-fp.20190830002356","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827220717","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c48f6f01aa6ec869ccde58e709f3c82338921cb2","_id":"@atomist/org-visualizer@1.0.0-master.20190830023725","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-0l9xggJANM3TmY+iWbXQf2tQD76AmFgXyY8A8IoPhsjP92Nah1Pouev5Y8fLIDycGVYDu3WyJ8T76EybzZjK8A==","shasum":"0f4a42718242d5b26f56689f7857a3804fa9b14a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190830023725.tgz","fileCount":110,"unpackedSize":710887,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdaI5lCRA9TVsSAnZWagAAMdAP/2IdTZ/cpEa7mHQaaoT8\nrYa2hvVnspi1srp/1D9qhdEaFst17Hg2umLZybbPIOsvuliU6ZmSXp0sm1eh\n32kYh1KX2TVXGQAUhe8ZcjOv5wysSBm4AhuBVWPmNDsm/J+UpdjzVX8mSLgR\nnzUkUAqcLsnxKpqqIaF75GDw7oIKMJnEnjdYZQnylHiEJYqVLzYoI/Oikt0f\nXaGO19oyJsMUjJ+mUy+OCRGRiY1XS/iUcjMJr+xUQ7/UZDbO8c+RyjZIFqLj\n0uMclPa6yRupdYlpBgQm0PRXW+Y9aixZIY60z/fecEpXv0SWgSb2k57YD2ID\nbbvbYeAu9LtxMd1D3VxN+HhfKDggKbuYLF9BnBqkmqIjBL3mETmDHQybZylN\nf1WLOkZMaqkmlQTrZ+3KHLSo8qmHFx4Vmh/Lg6rX1Cr+ulHsYIDHr2uLgiPR\n11wru+n0rXMXXvpqWqnNVcLoBE4T6G3dyUjI549n492kmdsk13YD1tNH9suq\n7Gpx85oqlwk03PRibh6zbY71O05AoGWICD5D0ZBdt8D4I2Wh0geKoqJzM/en\nFypJrpwX7jlvveCn8xRoPJF//nKicvgoz53Sjylm8F46iZ0bZUinENLADyAq\ni3Urob1wdnXTeZhik6PYCopE350rFFUSQWCqJevcQMxwuheefxd/BllKQemg\ni3m3\r\n=06Gp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD6mi7g1i5gzqvMIYyf06q5lZsH8reu7/q4ouNd3FRg6wIgArg8bsfqwIdXTBkg2VcoaoKRBnWiZGTqyTjO2ZqWaYY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190830023725_1567133284568_0.9792365060794803"},"_hasShrinkwrap":false},"1.0.0-master.20190830234646":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190830234646","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190830215314","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827220717","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f7920c4662584470a86fa360b402732b376ac919","_id":"@atomist/org-visualizer@1.0.0-master.20190830234646","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-3i+s+XfT46uJ/KpM+h236fr/tagbidlVs/gnbwpFoUapqIQDzwy1qm9CZ1dAyG1cR6cPtJGCMBtwcAdFkF3JEg==","shasum":"7c520f8e34f396274f0b627904ee89b1f123b7fe","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190830234646.tgz","fileCount":106,"unpackedSize":708298,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdabjfCRA9TVsSAnZWagAAul8P/RnueZep60eMkDFf8jnA\ntyODHTTg9PfJ96veoSBjLOChke5SOeTev6HalyLIP166+EtTSgqU5sNB5poP\nQ0dHSGpIlnnX8s8s/xjEKBBjpxDY0vfEtJx0VceW2VLLNi+qBxA4tjc2llXo\nYDaUh8p7pKjXTBdcgGBogXPrvxKIB/A8CsvqiZ5YZBKhbeEC115oyTA7zQRV\nabsd8XyCoWcy5MMK0ZAhlmTGepx2coce/j+ak+l0EqVcumqnrX2gG9210o+r\n+OyGeFPUhoPla/gjCEN2M7elPIXlpE9jF9SX+jQS/Vd3rLIU6rdJiQQtrM8e\nmDhmSLQxQEjQcE80dlqEz3CFtyLDh8WzLepXSECc9WHF6v83mnEIA2ALi12a\nNWyoca4Sup67yTu0YfbBsPbeu+8dXLP7ooxpwLpAQvM4/9XN77r3aseJ1bUm\nJFztN9Q4qwDi1YvQLxArb5ZpfXC6g44qbXX26TDa6srtmmaTxJrCXcUMh/Wk\nKqWz92+38vQWq6rd6NTKQ2UtQfwOfFOV93eASgRPC2kiCozYzH1gwe6HbYHT\nSU6/qcLDcEsTP7ow4KvT7ZRlAWdX8p/zMSqd6HFCKHifMrlvO2Ye1nDJ+mQN\nXjH+b/ifKbur1riM4bTv2LjyApTbG9WBo0ynwYZZT7oXussh/dxs/I9sjGa3\nnzWr\r\n=HKh4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCtupP+SByuM1yINtBb9PjOg46PkpAk7u7fBpJN4O9QUQIhAIHRVrLHsqC5345wGpkUjrUu/6IuLxWwf7D+u6kQNHCW"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190830234646_1567209695167_0.5058717232625229"},"_hasShrinkwrap":false},"1.0.0-master.20190831225506":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190831225506","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm","seed"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"^1.0.0-master.20190831204626","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"^2.0.1-master.20190826190616","@atomist/sdm-pack-docker":"^2.0.3-master.20190821110014","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190827220717","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.1.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.1.4","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^2.6.3","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.18.0","typedoc":"^0.15.0","typescript":"^3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0349416648748c5ddbeb42ac5766dcd87c689eae","_id":"@atomist/org-visualizer@1.0.0-master.20190831225506","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-oxOqOSaV4vYFbagkgal2+PB6CHQXu9+645oDP12FefY61HFGm1YDvkvinx8j4lgDqtTsybriavzXZfIf4V4MEQ==","shasum":"bafa9713c5c2308255bb0241b01ba5357175204c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190831225506.tgz","fileCount":106,"unpackedSize":707921,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdav56CRA9TVsSAnZWagAAqYsP/jaQNbme4+sm7TAJCx58\nBDSf1sMkObGEUtaHfW1bSr6axMHYabnG1db2XZnMg+fzlg25hZWxoae9dTiu\neCbwehlz0y474/PCcBAWWtoE6uYXMkbZooJu1VkCQM0o6JDl5FqJ3q4yRehb\n7E+lqCCWNA2Rm/yLQBsAse41A04D1jxNoQbBuJVpMeXwgHmsSHRqAVSELp6/\ndDrOn0+nVFS6Wd7q+OXp1mVgfs5rSNFzurJlcXPbZpcQiLkfL7piunjf7et+\n+dVn1N4CRSPdgHVkC6+Fx+iIY9/dgVD9XYmiWSMCydlTCwaHRM15+jDGH20N\nDCu1Ww9Is97mAbuWPHl6Hn5DgM3NJ5gpWLcRFR11dQ8zzlzAG3W7UTc9ykjn\ninvzsCLEjJ50m5LuHxYdWPzuNqUdT620T0DsIY3JjoPyqGDRkokA+scKby7F\n/a+ZrNM1m1T7llisA2bMOEyb8LcYEpcwceMaV+vHV2DalV/jLsczuCt85Bmb\nVqQvx0d6qmdnOBOOWf16lnttQy8IbUw4rfiX6YSC35Fnaw6Z90rAchgulrwG\ngbBLlETItRh4KCbt67l9CXkgyXqwIbboVbShQrHU2D91aVlCqrpA102UC1Md\n3ZKjofYjz5udcBBBc043CxvPqeqDbu1jiDwTYNVewYHihXbZGy81a7OV9pkx\ndRdG\r\n=+aIa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGdC2sFAjX2DkHpLm2EXqnYudKLPkhV38aeHau0xTKNEAiBejnCFtNhLE4NzV5kQ7U5Cb83VhVaprROIJ7UPGJ7b0Q=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190831225506_1567293049783_0.9670289014463793"},"_hasShrinkwrap":false},"1.0.0-master.20190903072211":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190903072211","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"1.0.0-master.20190903071348","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"07285698e4d7cb0dd7bf9f45b83a7ef3c3f54e4a","_id":"@atomist/org-visualizer@1.0.0-master.20190903072211","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-PNdohI98xSH5wzR+kKBNpm8XG7Y4x/d7hJh5Nq8uGSXIoLSHEFHPaC8JAlifgM6Tdvd/pk/tAI3vhU2E5/VHMQ==","shasum":"0f114db1beb0068d98afa3f91bc4d1f6e54aaabc","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190903072211.tgz","fileCount":110,"unpackedSize":716169,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdbhfmCRA9TVsSAnZWagAABYYP/1HjAtO6ufoi93UEc6AO\nSL2cL2DZaf95yxbBD8l9sJrotjinQwRQ++SaecjsY+1T6b2oS7SwjRxMxBws\nqaiHQt9nmM5va6G0lfiLlJMElLTnBCrvGZ/VHipXksPNhK4iVGfKXQexvoFE\nxY+KhgvFN2uvMJzLjLnXO2e91pY98PjZimxuvB8q46fdPYinK80kjts0/0AR\nmW3niRNj4484W0mtrvgcNrVjEiUiTL6Fjh9MdlKY151qOTk3pY4dYOBd3fo8\nxYm2Atod+5ToDoN23oz4U5WGkkHl0vYBPdXfPOxobk0VA/or0kXEn/Pl6hVo\nGcUKTie4vQR2gsSJ1lA3tyewlM/ynTYSShBRUwsfEf22XrvXq9FkJ1iyIlk7\n1dGmSmvxDAtQTalKKOKQIitnarVJthixCrjNow98Gqn4HQm5KhLlRL4l7FBX\nERDUaPQVbO/kxPR/jRqv+Zv/i/6BfFO2CUDAXboOt5QvNYCkl2ns1ZmraUGE\nseR0xSD65Kxej01IsMUWi/cc1l8jimD7g6z+jHMo2dvh62BAMTRFfLEd4N2O\nqyDlRGF+BdZQYppYSlIGUwIm0uPJ5zfaY2qF5VfeRP4AJjjD2ApQDOaTzkuM\nnRWqb7I6Q2CMR4isv44nz+d6v0yY+EYSKpHyILGleFd9EcxSttb+opHCaewZ\nbydS\r\n=3U5v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC6aM4p4y0mbItvHWaTkdayLNtwOl+0G6+HwL5seURHCQIhAMcQQF8AXYuh1q2+U+U7lMd5wJmvlaMJMkBpWU8OzV7i"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190903072211_1567496165703_0.978159634431951"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190904201852":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190904201852","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"1.0.0-master.20190903071348","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"43b62f639f910ec89a565781f9da23f827902702","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190904201852","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-rzzrwTZPuHH9zzWrfXBluCumKq6tpffwHhw74QMI3nOS3RAGMiuKW2fHxs4dAr3ByvtFXif/S21KCMO+VuCLNA==","shasum":"c631260d410d3461296f3ab99d0af3756bf05fb5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190904201852.tgz","fileCount":114,"unpackedSize":720046,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcB1fCRA9TVsSAnZWagAAQEcQAKDjjyfogAiw5H28rE1z\nTuoZK0Bn7mGgQroxfBCHFgRuaYkhOrWwQnORsT0DnCuKHiPzimzgAJDcLn9Z\nwPYk0L2b3g7/CFy2Zl5/gVm1tUbfK55aR1jfyzyGeoeKqC7gYu92a4p6NnO1\no5CGcfuwQwig3AADlQuuReJmHnI7Tu4JSRpF3wU9GcBEFcJWvfG3He+AH7fJ\nvp++MA5rnRthvfyBgPYo0Nwo4emH2/ARI/FcCbcaa4Sh+GSXKPBk7eFnzcqw\nCkkVagkTaC7gr0ShXdg9hLL8PE6GkzvdQDcr4xnXstwTDv2HqcOMaSJlM2W8\naPjiUB4MH9n1yykE9HynCcj2v7MJfrkBnhVlkT1fj7K/XKL/C0ljBtcWm7of\nkq+ulcga67eEeXVCKC7F7fxcYUAOOtp2xOslOTngfmf8iEhxrZxwKsKtJakg\n7ebb9uNqfsclFZBXZcNBw8VRc6OGdQtb/zDnJ3iROliS2VwYID5axE86lQkZ\n1DWdIVK9DYSQrgHgHlH9wE1Opphc5L30+eO4uuxl/+SlfobTDaw0F2Jul5qN\n40kKpzoUK1gJhEr0qLZPE9Jzh5fz5OxAEBXrfcanUxwWkHr2n4INauwqNJSS\nuONXXKGfKxyoSNnB+wwQXfd/XYM0n4C/qZJsmkJ+ruOSCpV5nFESRxWcl+Pp\nv3hg\r\n=nSbZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHjgVu4C5nXMP/zzT66dfNA6dqm3kzUwZU9NXeRvu02/AiEAydOUxKmh8/JRIn6dSb3ZKNhIiws+GaRzp/JB3i3cQ0o="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190904201852_1567628638338_0.3395873555560147"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190904205215":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190904205215","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"1.0.0-master.20190903071348","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"f5c89f79d38e47329bd5fd440650dac07398beaa","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190904205215","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-MqMfonE+NPg1bmiAuDanpr4JcPaueVSiioaPtri30WRJz4fgbx2hMLnooMiPAl5hKMPIi8iA5IObzCzIAsQbjQ==","shasum":"9bbe63095462903bf58f0a8443c38f326fd0ffb2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190904205215.tgz","fileCount":114,"unpackedSize":721683,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcCUNCRA9TVsSAnZWagAAghcP/2lvd2SGhADlYl2++V2p\n7vsKCW87KbWxroAU/2W/TTBXoVfJckqTg0V5Xd2NQABylbqGDBTe46IFsFda\n1OZ6P6lN8DLDWLz6z3ItoRVjBgVI5XSLysgfBVIDD1RvWiHNoncrG8SBIS1O\ns9E8uZQCEp1x9rC30nDfpUuIx/JnHQG0vMEVFgku8j+Cw0oi4rqW7JEl1KPa\nV0dirSHzzQFU47IDGuixtaxl6LmnIYKqrMPUOnhbFkR1GW3CgJrg3KxFBUts\nHhDLbHr3j9glOLjAvFYYp+FG5JU8HpJyjifH9jC5aG8+S4H+VcRj3FM9C2A1\nGmhcVzByJ3rnyd/vm1KULSpvTStYIk/uuM8sB0f3ljgUrAI2S55kCE9eYK9X\nfsGFYjkC8yWOHTi5FQmHzlltdX2Fw81A+8d24o9l3iP8rMvI8fkfXzXP+OyN\n5CDhsPhmrLxiOH0U8L5S6vyyh3l9iMYx1kortPUd4cyaTD8UfBigiIWZWfnl\nQjJupJ2KqAmYvBGYEnJUj9Dyu9Jy4F//G+PuZygD/XRGKkQiSmRismRbfYf/\n1VJeC3AmHuMdoPtSmCIkcsvT5n6rnNKddvl3QjR1mMynckZLdh1SPvxlVrAx\nibngKJZY1Wx3gQSD6Xao1oL1nddfYS1EzgZEDF+HDlb2gJV8RzsR8WTfDLfN\nDnPF\r\n=DREj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBbIA0isbPN6QIc8fqCrxznz28KKohjEY+6SjKN2m5KlAiB7aZO4k15DfDCRqW4pdKTjLTPxjsDAJqjuEXPwlBLXeg=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190904205215_1567630604546_0.5861657876032345"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190904222527":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190904222527","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-aspect":"1.0.0-master.20190903071348","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"9cca02da04cead479d48c07887ac405125a42664","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190904222527","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-211fnhAYAj50U8kiPQzcGm3WeRJtMeb8dy28YDxUVjxyE861K7tlyqOeqSy7rFr5Y7pbiyHZt8pnn0zeehJFBw==","shasum":"28e35cce900ad3d0f5c083a37f52b8e48f71bee2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190904222527.tgz","fileCount":114,"unpackedSize":721687,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcDsdCRA9TVsSAnZWagAAtk4P/i1abjTA0Ysx1ppmYeDq\nWPpJO9G4cLvy54IoxzUkkUm6Drj+rL3MB9dYUfP4LuuvbYeK+Px0ru2c8Z2y\nZmRvMNCs5Hsmw4+G7t2SVD0geXGNLOfkXoiT7tky1cQT339b1D9RFD0svg7x\nMPzm5CuEq2CAqZLX+MRaOug7O3GtEC3SEtNp05PqXdxS7WQWHouK+j5LPByf\nlswecvvR8KWSqZlRVLkS/JzHpuGbik1SBq3ujl7Lst8n5pmshCnVWd9SLkNR\n9maGppBepR/L9fHqVBj0/R0zNyY8ajaUv19FslJpiwKwo3p5nMasZyelFEOr\ngZtz8nt86u7Oo+g8unood4UlSNAZkbocWY0mUmcLGLytW35BVoquTAgmTwOE\nZiEp3swUgOUewFL1a9aqz5ClJLUWw/JZMJ5WuvZeUTWGmmTyjaRZlzqX4pp0\ng0oo3/fK6gif7WJN2oFsImX0cvf4L6bFd6j9HnxNQrZke148xC4RJ3POnDPO\nxNd4fCkLxuM+ggeE4sCTUNSdXfLoH/2k5JA4tlaDQNgWMPBl/69uzklh3VHh\nk4PmtZ7NpLN3eFP3Hgh1Z2ySP5z9zJYSXG/x6YoIexe2LLbw6PwPPcOf2DVF\nAO8kfpHxFsmI4EHEfCOFszUypxpgds0vGCA84kVRr4aavXxPMW830uTRQ8RQ\nzFIu\r\n=Cont\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCo+ThudOZksZnjMtda040Cz8AeIsIjgDprQiw5F1ec8AIhAK54KXqWuMgdEHEspw8MjpJ1FB1JwbLUtTa+Ya7gXhEA"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190904222527_1567636252303_0.9409785291507538"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190904223925":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190904223925","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-analysis":"^2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"^1.0.0-master.20190904204232","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"^1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b309a4d97678b26d248599eec24f1888bb314f6d","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190904223925","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-SCzNesyKqqsiGi1QAqDtP6OA/xwCS5cm5g/WuIoKUGWA7SEdkeWsSg+M3e0eHU4nS7ZFVPim7sBHJIfs+v42vA==","shasum":"eea2eacf09b0530df110e28f5f7c20cafcde9698","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190904223925.tgz","fileCount":122,"unpackedSize":731130,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcD50CRA9TVsSAnZWagAA0T8P/ApL3RLOGgxFW0LCXhep\nAht9jOtvhC7eqzJrLUov2dgovX/6PUQ/bVWj2UwQZ+6kQV5KV162fPfNbTtX\nXHp7YVm8nyXwv4burofCgYmGUiYHg86gmAsaPOXObLGS2AmjjU4w41P9jkn8\n/z4hPs9aJmIjPNQFuOvgUJwfJsE19qm37g9cHfIc/DXMldUbgxDAGHxPme/l\nHqHCKS5R7PvlfqqjX8RREXLIfalnSZNAJubbOnQNVwLeSU2U8MceIbxxZ0lB\nE7OontcFJ2Xd/mqM0BlUexLf0+qDnDcJJ3c0qm/X+7ci+gFyIjUZs4DXIRUL\ncsk0vYmvZXCv4pDd+5+JsiwI+Ewi453Waxf7lk5KJvLaEYsRE8FoneCVFHMh\n6eqviBK1GvuMs1yXhNDx77Twjqtb1c6lox25jI6Shgl8f7uNgOIGGehi5GPY\nYnI90+17qFZtFsXKHxeZKoIhThoadpweYxV3zEPWVd6hl2S9wNzUw9hvToqI\ncqlHDzoYlA7Lc5ichhEQvTo/v41/zNMlKLoQ2IdmD8tEgp2l+wbdvAZfwJen\nyEX51GQXX+oRB2gdQBx9ijXTF3WuAPPwFgpgSqh7YdBW9unZbHrGqMKLEHIC\n3mQJ62yQFmj461iii9VnkltgvfEDFMLIEKd+T7lqoSm9lCvMUhYbd2eK6Y+V\nushm\r\n=0PBl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDvZGaJmMK+EmXDSxVRIxoXdk2xPzFofFIRN900HLMIqQIhALbjb3TShts1g/CoMlJQlHSMB1GICT91cWwK3zmqO8UX"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190904223925_1567637107608_0.8885697760972346"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190904230128":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190904230128","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-analysis":"^2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"^1.0.0-master.20190904204232","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"^1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"6168c5cfa3bfa674ff8eeff8d23bdb7ab1522faf","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190904230128","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-GqMIND6nC/AZwq28ymTikb800ZTR+/hbBSMDSE6jpu41npKH18fykpCqCSDlGj5YnlqyFutiIJ6ip+BEyh3BXA==","shasum":"9f0d449c0c8142f4c4cbd3ef45f533c3cb3e0d19","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190904230128.tgz","fileCount":122,"unpackedSize":731105,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcENMCRA9TVsSAnZWagAAC1EQAKIurSlc22HHwAmZVTZ0\n4JD9aY4YGicwwCtBXrJecgAdGAqPAstFRGPTW5rPrV2Sb8aX+pmLvWTtZDWp\n0qQOaPhA66PpWs+Nj4Z7aYBq5Obi/pz8kW3U8CL4kdRKC1evMu/yA48XDmel\nHaknw62GpVMF3lMofEv/+7ihyvaStm3wzJj+fs2ynxOfd8bt58Vr00VU3QbK\nZ2mxtiic2tbZQ2czJbmfdW3PkjqH6SKUgOG/dkyex3ffAVG62RJbt34OXNpL\nc1hC2vFIGUEURm9wZU6mU7vSxv/3DOUQOryuzJPMK/VL4/vy7sJugg0Rx5pT\n2a6CWfFUAQ3ncCLNUPIPIGGpTc8tuAIdumRGqNT0HuogrXLKCi1zCbArSpNI\nxO2hVThs7kGExjrUevpifLdAtbQmVeOhoCiSx/9wQHhyatikU+Kg+S2C3klG\nJYbR5Au651iUBV85jRaWYrFQIoGtU8CcBUghJf//aRHyN1AnKxip4D/vwC4e\nVR5uyRwz+OJn+ve1qEbnw0PEF2fwY10xf687tbhH9bb9TxCq5nH/NtXH0V9J\nF2888STn+oBqh9ZRguI31vn1bhiWxJgvpfytHExSRM9f9ZZj0S5V9bSqaugT\nAuGYEFF91cIAhZLnlggGstkR+Si3ynzkYVEXuG6KcFG0wl2fkMaUK5NO7KEZ\n6iPl\r\n=TeoA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDhl6FrWnTAM90OwFnYmNLyPfMkUk8FzYggPXtucoppUAiBqwUqQwCKm5mpZWb+nKXK5HlJsRbxGU+EICPmr2CWomw=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190904230128_1567638347048_0.525042650741602"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190904233813":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190904233813","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-analysis":"^2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"^1.0.0-master.20190904204232","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"^1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"32056256976f3d81bff87ef044c277899fdf4a7a","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190904233813","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-qqqFJ31QSpLn31uslm3qLBnXlv+jOKWr69GDYbM22Mdbbb0I6R7pPkVgsFmutUpNslB2UIxAE76yu1Oc4955XQ==","shasum":"c283b5f24cd08d8b71d9034f697901cc7708703c","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190904233813.tgz","fileCount":122,"unpackedSize":731841,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcEvsCRA9TVsSAnZWagAASHUQAJbFLG6Qrkra9OPeBlAg\nmVf+l7eCWl6wXbJRz0OFtSHlU3w7AuI3DTW2iBu3jqBg3QiMrUxet62/3zXA\nlxJak/0t7HDgi6fkP5pn2sqY7j75W95kysEqHcLjO7eEFSSXcXVuMS75qVGf\nS12nvipj7EUdYt/m03mf+IC4oMLWeSXBRBiZaJG6Y6uPtUCBDijlo2XbiNce\nwsX+1sBtzMSB1BY2sbVVVsoSNXZcwGIl7Cc07qjaFuS/k9pdVZeNnCPLnwkY\nRHOr9VqJw71qFD99zOvA2SV2BfysJIntjj6FZhzB8AuUe9NKM59cczU4FrIr\naUHtgttV9lCKSkQ3oGyP042KyWmILOOmYZ3wEIEGaiS8aJamOPHILBj3Fmq6\ndc/SxEcVreC9ZE/EvjQOOvq7gTSwyUXz6Kr2QYGTlOMDQArHEs1EuqNXubV5\nlXWtJIrcEBNRDztvIVhQDntQDET16rjVQMKko3s+cfySr8X0+hGepOYDlRVy\nbZWSnYoNpunFe+tTtwvLyqJOREiQlRpSivC2oVWlVGF+EqFaVeB9rDPEk8qC\nWWpnQC1Y2yeg5aXNb2aYnO1GDBa4iirIp5zSBRQUqydwlzKkW2KZ3qI6At30\nwz7ZhKzTFRU7J3mU+qphgn1jsbTYoUUFZ0EzkOT0wRHHfvLjzXx22A0XTmNm\na/p0\r\n=fiHI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBvGjq80DSDFrRRa0Wcej4+RlWyBXTnJCag5I0RyNDQiAiAf7w3qDDUnk0HkzH1n/WEZzqN4oq3QbawUpEBXQgGhlQ=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190904233813_1567640555514_0.28649212479394404"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190904234304":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190904234304","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-analysis":"^2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"^1.0.0-master.20190904204232","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"^1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"63f0f370a35b8dfba2781f60140a1514ea4710cb","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190904234304","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-2z5frLbSA4/B//DbzH3WPuCOAVI4WGSNrr7iXbmuK52PFJROE3wcuNAMHfCA1cPfKixufxR25/1vSsRlei254g==","shasum":"997f397517675e5b5e1176e9d9bef4e611a56531","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190904234304.tgz","fileCount":122,"unpackedSize":731209,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcE1HCRA9TVsSAnZWagAAEr4P/20HruCP/MDbzin2AdrV\nKynaJ87lwZtgG96FC5gcTP/w1gkAfhY85MOTUIScurKn5sYrXAETBfJWG0e0\ndzpIeWQWbacuJ00Px/JgAAY+KXD6ASlOAja6rP4SOZIbYPN9EaDbXv2+18/p\nag5V5uRhFswcOdiExkgwcMeHkUVq3NRIFsvkE3vbJ6VADtLdtc2Zrsr0I24Q\nJmgP7+ecqx4yqjE/nYQi86ias6DmeQxRHTkddBZ9vZRUN9Y6EpJvAEF4na0S\nK5Q7cj7X5L8m8dhDk1RckzuCyT2KlriK9D0Z7c3tTmELRA+wRpsxdcEO+6cR\nZDjUI5ZRB2bDUi9PTSaFoeoTT8H5NNdMofd1ZRlipYUv4f4pEttRvgvJaLhI\nXjhRlCO0Yzx3h2w20xqpNV8pbAXfcYGqxP5iDvwVs5Tdi5SOQfOl/jY+lbP6\n9hOGxIFEKgKjgq2ix2E7+V7C1Ugk0m+bReLHEvj6EGpOGcu2gdn1Hd9ctSko\ncwKIJMx+c7j7U5IXgD7KG2gxHXSjXquUF/1RoB98lkvQAVrLDMjyGMIqzrvz\nRZ48hH0KbFNi25wQQSJ4BQ/26r0rRo7pgtQFB8Dw1DfKpn3bGG6gkWui/+SO\nh8FcKDxY8m4WEXxbroXEtgQaxNFFa5fEgUILoq5/khjrm5QLZMrmtpm7KWmk\nmXzx\r\n=9jxL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTP13NOZhMVdLlLM6HckqMFmKJuwniBBBiORm/e++9lAIhAOZgfabW60hIWhycnIHhyia+8rMoZDdtRUtt/lDTjQFN"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190904234304_1567640902645_0.9084154604838011"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190904234150":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190904234150","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-analysis":"^2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"^1.0.0-master.20190904204232","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"^1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"63f0f370a35b8dfba2781f60140a1514ea4710cb","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190904234150","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-Bozrws+NNTdTCl0bj+9S7WitrsMYT3dtciKd6XTjYMgYsq7vwv0urz8he0w2S7yY+2aHwahN+mw395CcsUE93Q==","shasum":"042764f2ff6b980414eb0008654b6df036004878","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190904234150.tgz","fileCount":122,"unpackedSize":731209,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcE1vCRA9TVsSAnZWagAANmcP+wcbvTcq2IMa6LHlbPc7\naWiJAAaXLBoQZPuxLfL0NBLOmFlvXUC17iQojrqv57qvy7oBqbl2txhxgAI7\npfsGDoykoeq5yA3B0uQrYY+5mtmo9JsS6uj5gi/Uo+PgmMIEtdV+I1jQuRQf\nOSiRgzsns2Br78cnPpexIH8jnYvAqAEmItYxYijx8iW88lEtyr1uhPiiHk5y\nyY64QomVgO4SCQ9uLiPTUOKaOleBj/PwPnMQc5QluGHnOLEVV1zg/gLBU+LT\nMskh5I8dwz4NQkygjS8+mc5z9QXltRAdCKhxFXZBhFtiNPUX+/JA9vdhQ2S3\nqYHNk3AHJ4CoMC5LM6jCfjj5lX4LGpZQwILxwMkNxQW4hKQlpJQerET7bayA\nyXQ65TCw2g23ch0Vay0BB7uhcljiOYzLGB4Um1cQYyfSiXUb5A6GkEBQH18i\n4kBgdGKBd8qHTXRiQEx8K8fPXpBzCKfITJhULLdVb3omuql/K9hGyTRcAuKd\nlqkdptEM6gX3b9ot9544V7XFYTA28dMjRZGW0qRBtQLExZDa4wA3IRGOj9nt\n6rfJVyayIKX93/9zmMto+yNbjyc2033pfT+NtcrJhQFSnKt9n8ugmhhfyEP3\nWbTrhsafukjNN6Y35irQqFI1svROFZnA4dgxvawdLe2SkXiavpy+PfVdwGRH\nHEkd\r\n=b/j3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG9bmoprfL/7QPOJAKhOtiGqCYgEAY/a+xoJF5PkeO6/AiEAmwo9aT8ytR+0WoQ5iBGM3csUaL47WUWi+YkX2qI5tOY="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190904234150_1567640942748_0.6093365712622214"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190904235159":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190904235159","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-analysis":"^2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"^1.0.0-master.20190904204232","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"^1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e09dc99efabc80baab84ebac419906d4a164d780","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190904235159","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-0RVIcAvnKrYdJDWrLz3pTwS90VnpSW5iccZIpVbZJDZeKhoh+IxW0rIccq0AphCQHhw/Q+TEdZptyhhZdBBEmA==","shasum":"f8866a1adfa1d82305c8332abcb0263257c0533e","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190904235159.tgz","fileCount":122,"unpackedSize":731565,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcE+KCRA9TVsSAnZWagAArLoP/jm7hYZfxVQKjDo4Hk0B\nwxPfDbZKdFJXV/l1HT5wTIUUmR6Y6w2hFOT2cVCgKfch9SVnzcDDB0S2HC3c\n1WfvN5EpX1FW4gFz1hm8e1/pQpO+GOatvfa+kTbNiyYeEJOAk6aB6v2dQeeI\nc2Ui1I+rJfGjA7eTb0ysyOmbccSHALi/4Iogajzr8hl6oF00Nim1cEAPD59R\n9nT/gbF2WQWzHqHmB1vOzYGuz+Ci2v0J1u4EOhNEKpHAvJ+zoDG6T2yOHmQ+\nGfj3ZOMgZD0/bbRX3fmJa74nP9OQTFZnXQFWtYLJZJuwMMiUcMcoNMlKmuSy\n54inIw9NITZYf/qjaEFv7asSuKhPt80lDt5V8QnBZCffUg2fUmlWpOm7YSJ4\nk6TqxyG4JaLsNToj3pbR6zwrcqr0pfbP8S7U+jZ+IUdANm1ooiKKNDADAAZx\njkCgHNonM0zwcBw9vkjso6JSqPXELsWMGw51VxNUCC/ZaBNbOl7DYiM6+Xnl\n4DLHiqqs0TXTqH+jIDyOY2MZVTTQxw5tNT8huo/9YjVytYdd2EPFNUFqyGHx\nwFottWJnG0B2NVSpRn1sR4zb77XjwcHnOLGGV4HOrmGfyNUs0LTFWm73uV8w\nLENdqJuQghED26UAGgGR1IaGSrF1GbDnw+svNiot91LvGiZrz3sFBIrMIsdI\nsXUt\r\n=raDf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCxg69oBHzCk+d7d/OHbsHIxeJr5MgZqU6kMFJKh4dCJwIhAJCbYOK+vQQd8EE0T6Y0CIgFyKsUgg3/9xV+hQiruk5v"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190904235159_1567641481858_0.014918690091987097"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905000743":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905000743","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-analysis":"^2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"^1.0.0-master.20190904204232","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"^1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"0482a845ec3a0b9ef52b64814b4f85e4cdb6c558","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905000743","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-jQlzcbiAssWkE5s142g+iAzp5CrBkoBPrekb4mLfxHznRwjRApEoijSMZ2rzZzPSQge0gwqjo866OgGPRvu0NQ==","shasum":"d82aac59c5a60fc8e1a8249ca0b7d29acca232e7","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905000743.tgz","fileCount":122,"unpackedSize":732310,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcFNdCRA9TVsSAnZWagAAH6IQAJ16bi2IKAB8YQ3c5+qx\njTTZZQRfHea7yZ7jdzesQxqY0AnsjOxLbyo2hlNtOTVhppUC46zK3JSOpwlh\naycAWaVH51VJrJxXHJCfbTxwwoJgLwbYKvaTrjCkTcbV6iSJgRBSBicW8X1Z\ncS4X9mBWvXJ2fsmNr9NBSRfBqWUwfIfGgAWvpmF93gigWNEuKIdiFw/dSOGF\nnEhWhqFReenY3ZOY4932eSWzli667E2xoMmazBkXX7BPRU9cMr/Bf+3mLyBK\nManpMxSj0fZ/f8YKvQqIrta0j50+5wXMI1aysd1iIjJuDTtXNaL80w9RwKDx\nykklj0i2iv0YjcqSTYBrYMhGpEcrnTPrhg2RkCtmqSw7aCGuGOQ36XnxqLuW\n9mluVG0WgbzOdXyeRnPiabH2tQqLc1BQf8Hs53LDvHMvNepwUpe5RV2czOKq\nZPcncxXwEoU05XyO9VKvukz/Pvtoa7baTi5AVIt8scpLB4lkYDPQxzhCarDA\nUFgUm3+z2hz0d8zgDDp64Jywieyxru8ok/zsGTHopuiiPhQ622svKD89ZwT/\nf/az0KtoeptuUu1OXuBN+YUQmoH1ZYh4JyPbqsQS3Q19d9shuQZRxHw7HIpB\nC6jyhxxzloYFZ/pN19eSf3bdMowY7qZL7jl3h1bPhCWYGix4fTB30DMNoifS\nQKyF\r\n=JGJG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCxDjaQTEQMgdGajFpw1zdGPl1Lvb63JLk4Ty3YKrMmIQIhANrbDxMr85FjrxY+USpheBs3jN6v0E2vzIixxmmHVoby"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905000743_1567642460746_0.5432277882378727"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905012141":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905012141","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-analysis":"^2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"^1.0.0-master.20190904204232","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"^1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"4ffecdee639308d984a6e95baed65310514d248b","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905012141","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-+Kk9vk1DhciEfDfSgJkzGq4Ot0JZ4jhAvDSxVSBfI7zLcFdFlxpwCGx1kavTf88mLg/XolRoCn+E+Get3EqnQg==","shasum":"f6a43f675072d555664e3f2cd06fdc1bdb9dc87a","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905012141.tgz","fileCount":122,"unpackedSize":734237,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcGSkCRA9TVsSAnZWagAAW4sP/R1avA5q24UCPYcjU8vt\nZ7RLamqBGqWG3hMfoaQmaFkvZVlZkbvTGIP0nRw6xcdP1L2zp5114v35fasN\nwdHp8tH3Rcf9CSoV6DQAl5Lc2Oe5M4/m1V0w4ZgrXInFSgXEpZkkp08VCLZi\nePTc9b31keph0ro0bcY36iPhbxRDZeFK2MZ83uVYrD8wJFwhFjzt+B9PecWo\nDVEEBTSG2cuUoe/CBhlNP7wvcXj73cWbzSHE9oIHDH90RQfED0vsLtuJv4UH\nO9U/Uqvf1p7+5BTeX9dJ1iRutCsYuzpDpVOhY3IfeJhgGtsdG8iSEWs9kAdI\nCKeEdcLijaosU06ajV534rSv6ILrjn5TXRvmdLVmQkLxHFvUxypLIwsteQrN\nZS/hCahu4rtfE6QY+v/CQsj3qXt3Hh/o0r1bOXietb7fVQiZLoLDp60X0LAq\nT7GSbcYEXIVHQBwf3pGmdQKQgd9Rla8rMAE5S4a8yevAacVL43s9fBCsYtyV\nseJoIEkeHFs5wzc4EK3ugH3UuAe/UZGITzHXARUDfYrAzVxBcLZTU4GjoDbd\nQwSDau63JhBIf2npFpyXnWac10c1g30sCyLQ6Be3sYXnzJzZ54nqj0Q+BS3j\nNt5A0rLDXpuOK2WogYBBNFCzMiiiBfYm0B9HfKmTWC005hV7lwYdqTg/uiBO\nJ2ua\r\n=i/6K\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICQ8DzjSK5UyC25yJ6w/3Tl5sRz5uBG3dUaMNGpMRGAFAiEApTZHc8titqicXGccdF9O9h8Z1DpIKhKJEkowvBz9dm4="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905012141_1567646883549_0.2502190995869662"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905013159":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905013159","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-analysis":"^2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"^1.0.0-master.20190904204232","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"^5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.0","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"^1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"ce21cf0c92cb835de6159a3c8cb95e12c97226a6","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905013159","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-jLSdQuf9I0Y6dyNCYwaGdF68siv/ujUFGuDRWy2ITCXYhKwpZyniAN++M7C9NbmC00LHJlvvNPHEdk6Z5edzwg==","shasum":"fec6fd960011e30b8e793d3f0b81d05a31c588a3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905013159.tgz","fileCount":126,"unpackedSize":737703,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcGbICRA9TVsSAnZWagAA8sgP/iYJXd465jbf6/NJ6XGv\nuUDy3jxPwxoq343SSmc6GmAZhs49ed70ZGqeMiD7fdDzMtZE2CS8wfI23b1g\nqzZ9QdQ+0XLe+1pgGzgr7SeXIsMUY+uh6SwNuRy0lh8YrYO6a96x76JoWG0J\n9E79tZ0YU0gG9hoMGLYJQx8RYU9kXDGWd61sVdsY9WwMe5lbg5Ra6B1IyI3A\nve1V82zyf6PD3OUkpvCuTblaMfytQqlbA5q7YYU+XYW/EOgt1JC3BnTWDPbl\n7fi2GxO4drvX2KVxH8sO1IqtBbD8uYl1nLeWrhjxS/sb2HyyqVmLJmZ6VBj3\niAShOExWRRaErEKOcVBvLJHyST06vF5pBXxun0kcvWm0t25yyOUUEqXb+kr6\nv4IoT6m3R2KmUTuIWFYs9qnHFm3Y8M78hHI7T1KzfrKItEbVYM8HNvQ3MRjL\nSfsJVCJ2xykoaeq1yqW8y5+L3+JoGFyn1j3V3gMC29non5Lqx3AjVMxWqGDI\nyyOo/9o8QcAlU2xEdKcXKdTATXkWmWnqpbf8SfKT0KBMkPWcRD5XIxipBB6T\ndVU2n7zt9U1WEUIm0hK192MxCoQ29zjxu5NH5l6MG8gMJ009/HfyzrXVc3AX\nHvktA7q+f7q5FhdEd4oBlmAjR1Mv+HQxo9S22ThXHsNdtQ1euYxNEWAAjCxb\n4ijK\r\n=KlFO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC1DB48cxgqEit0EoNUXqV3nEvMTvZ1E0If8R8ozVmJLQIgY/b2RhF6Cw5oEUd/K/R1fW2Y8msA3cQzdzhHu8FKs6A="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905013159_1567647431568_0.5723733500700292"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905141842":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905141842","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190821065818","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190821222758","@atomist/sdm-core":"1.6.2-master.20190822002319","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"1.0.0-master.20190905095751","@atomist/sdm-pack-build":"^1.0.5","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"3.5.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"64607eea6e24aa0fa15d93b64623bc8bc0cd8e7e","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905141842","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-nwK9j2EEb0kBQuR4HaWlj6T/A83tMHb7lhHfJipiqnnA66MBalZX5siqASNGOb3+YwX1oGnI+b1kQOOqhDjMUQ==","shasum":"57673948d233cd2514b2dace399e900e36280ee8","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905141842.tgz","fileCount":126,"unpackedSize":737704,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcRo5CRA9TVsSAnZWagAA4JYP/3b3wOmSIXIpCVKJySTC\natvqY5AsyX9txqb5MbYnw175Kuf7yMwzlV7y/0q2Q7+LsITetPvaowNSq/DK\nIBmG3PnjEhiqen/KNbfT2N2AeU1/Idatlvq5URzJtOe3s6dCybiVfx/Q++mi\nJJWUuh6G4VSob20vYKuVee9d0s+X1J/gAOhH9cnaOnZbd8QIxHaSjFttal2r\n0HVH+qk1tY7naiVasIftzeduwzo2malf1wDG2KC+oWbXh7u9ocBm5eey0RQe\n0Drjnv4x+RZoOwaEzCNC1sDCO7ySVt0+f4zBgxst2SF+L9qp/5z+Dbqzf7bR\nkYmXN/6Xp66SUkJnwHx4AQM3zpbMfvb/2maYfvU9Mj1sOaCrcI1Wmx9SYEq4\ngIDFnjiqZ0Lo+Ezz2vzsIrP8FGNoaQIc/so+tuYlmZVPTIr/QSefw7M8IK3W\ndbl8aZOae5Vm0S5GOEqhHH1ikZ4KLY9z5tdXp/p3JKf3uN93KxUL4GJrR/Wd\nUw2t1z2tXmjlkpVHu4vH48NMMvMQNBx5CWIgswWrmZf5OOLywM/6le2axKuy\nF6AmptEY5f7zCYeOw6BwBeGpj1UkbgCQfdP/hOP87dYeXy0RzpVFyLEoCobJ\nPoaXBTkkz6vxFHWFePWnz9LSyq3vniZK93/brlopU5SJRca6s5rFBNYkmpjm\n1H+G\r\n=9Xlm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDQN3EmWbWMARQIw0H4lD7X8O8yYi3YHaRwbO8kdVu/PAIgAcOnGhYt1O7+roRJ/RN3St91UwijrtTSf/4N80r8sok="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905141842_1567693369185_0.26261660563065137"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905163419":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905163419","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190905142444","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190903201907","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"1.0.0-master.20190905095751","@atomist/sdm-pack-build":"1.0.6-master.20190903202948","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5b46b1bb8c9abc1724d9b99c26e4be097ff970ab","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905163419","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-ZKahXDk9DYlfJcueWZC0bER1yWmtLVfgIw7eAj9z/f0xL8RhD4dTzShsZ7mShWdBGiONChcLCsXO/VhHD0yA3Q==","shasum":"608499f3bff37342917db280f93eefb940525cd5","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905163419.tgz","fileCount":126,"unpackedSize":739934,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcToOCRA9TVsSAnZWagAAYHgP/Rs+4DLYYEAjEuuff6qq\nCREI5ZA1TswC1waue1oAR0AniwWouxwF5ROMKpRbO29PE1IqduC+ln0jxhXU\nSOFOXNvSE27ADTl6cmXzKNomZ4i+ysTX0Wh/+/NdY1mM1jwSSB+cXuWl0/s2\nrIuwSqMSznDoSpwfMEtQTJzlXd9OtzpYbzHeQbho4OHHYCRmfIu/4ugaixnd\nlLKTyGYTaCChdaGjD+0OghvLO06zDFNnD309an2xDunOYPcjCFO1nNckn2yf\n2+jX3aMPpjBIV0hVR9Y0jIW4PLTmU+CJpbuTHfF4DP2Bv1pK/PbPeE36mKEH\nhCPqJRIq3SS3KxNjKXnEa4vRehyQYF8/aKt4le6ZGAXiqrY2c0hjcUFDDN4Q\n3w/kw5c8n9WGWC/qPDqfcEdJBN7mIDlSh1Jtdb1XiZ2l6nKikKCXmjYZioju\nKqJ35ZfDKNdzJdvJ6i1ThIlRhm/C6mz1q6v2FM33wTNixh5ixTfWMaqi0zFw\nuTRoZ3/xiYRJbhS0qgdnN+RrFDxutN5oLEwtKv8td6detStJK7U9MXz5klqy\nFddeRGtegWQOQXe2cxgRTRrrOLDRgK2hCpxlYUiTOxr7t6xbFLwUORO94+sm\nBHZdJfKg7qS9bnvWGN9oxGq58qUyTc2qK/+q/sNZFBrKBfAb0j6Lr9qLD3kw\nyZ4U\r\n=SVG3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAnPwtc4tQfQ6D/MAu+UYD1zZggD9SlS1LM4BkfQ9YftAiEA6+KhF+DPLvw+Q6V1PG14ZgRABzL1AmTpRXi7bZBQmJc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905163419_1567701517699_0.6985765681271621"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905163638":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905163638","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190905142444","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190903201907","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"1.0.0-master.20190905095751","@atomist/sdm-pack-build":"1.0.6-master.20190903202948","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5b46b1bb8c9abc1724d9b99c26e4be097ff970ab","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905163638","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-/a2xrV+B5B6agA/IdY27xWBCEUh1KzIgy3Fa3pn2JHOz9DQkfNNDrHdFIWFzF8o9VGcoTuXNtjiLQ6Ok04WNXA==","shasum":"c290c0d3a4f8a217f6cd879a5286371d923dce15","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905163638.tgz","fileCount":126,"unpackedSize":739934,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcTp3CRA9TVsSAnZWagAA4mEP/07mp7foQOEEj7n4iWc9\nuOXezdEPgHPZCNgVrkNWQs8yK+YCSCiekma93OutVNIY+fW50tEM5OTSiUKP\nnVvCAUEG0K0hdfbb8EyDMiiMgvymH/FO62edr8Q7+FAxM7uxBIhiCToOwus9\nGFUoJgXAEPZIu/kVNKOJzRacvQ4qQ7p/DTUfFN5Br0dcLKDpza3r8vXRiozj\nal1rXZIinH1T+jmrS+wn8PyHZAB/aPtodRX1OZXbtF+C/E/ukGLt1zq6v7OW\nYCeCoAR6r5TvM5wVXLODavHpVzIjIx/mSYGJ+OFlwWVVmQ+MZGVUnZ/fv2VQ\nREYU5uv1jH2dmHRoJrGti1vbzCQ2fFCMh881n/vd1ekGvf8X5pLxYE8CReqE\nPIExmvs+IIbNPDCBnEJH8PP/gxExMyn6iwWUpzL0GfjASvqK4YuW3fbfoGQu\n/viHlhSFT9E65HfimFubiAgprNag9mvKlNqHV/PtDPsjb+gZU5PcGGrI/tuZ\nmkne/6EnAWLTwHZtZsoSoQIKjNhkvARqrD1Dc3cTocfXnTfTg9vrmH7VpML3\ns0OfzG6Q1vfOOjcHsLzTVknNBR70igtnRyInZHaapspmeRVjMYxaYPnKmZpm\n4AdhBnC4ZtkI7U4q7sU/UxsRbx2F7iT3FVXw7JWlieCMZsOMsgQZcWqCCa5E\nWdwO\r\n=PRBP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEuNgAq3YFiFHwpqw+8a26CEfR+c90O+fNXS9uUYiuG/AiEAuwI1QJad7tedmJjxb/598AOs2ET694vKFy4i6wP/rHA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905163638_1567701622403_0.30884985387444663"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905201435":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905201435","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190905142444","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190903201907","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"1.0.0-master.20190905095751","@atomist/sdm-pack-build":"1.0.6-master.20190903202948","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"88d8351145f55151fd9d0efdc9106b5a4c6621f9","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905201435","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-MU+HaMxGg9r6hjjanGmZBnTP5TctFAIXN9lb0/GO8fTNTZBIBMiai76mpZomfzXhJ6K2hpGa3a/DZdoGzGznmw==","shasum":"a6acb309dea66dd8ef95fb36907a81fc6c39d699","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905201435.tgz","fileCount":126,"unpackedSize":739101,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcW1mCRA9TVsSAnZWagAAJ8YP/jm4cWpeQ+AhXIR673Ej\nIt0fV6k1cIb5DB6OkeBzw8K7cm1CBYNi/tnJmqP2lq0AHFv7hQym6gzP21sm\nc5qdd8pkqaacYzICQBM+T3q2wzNRsGhYzVP5kJSwXQlB0mVY7uRDLn4KxB9t\n67vyRv79GBsWIq0/jXPXkAhw8+njdMbtgUyqwuuqscjE0Y3i8gguQH16qat5\nD1n0OVnOhuSprvYUqgY6XcOESFBjLeUSeQMk7AEYTHkg9I9nSs3lWE18xyWc\nqGkpm7W7VOw65Z/q4EZar2tZsPjH3CnXkKtnj9vAwozSFH6WlfZ9EvOq1dKI\nIhStdpGBR6lyiNLXCpHyeIcA4TZovWDcUSe/HaBYwXljGzV3nX534q3O0X/p\nUSOvtGAl8FB0Y8AbaAi0RpETaS/5XCQqVWqK4ZiYieoC2IyYLMyEaOx88hgq\nk4cchn1f2LbTUFpyjCRY5kM26+LmTki4IwEPDzJJGXBPNwDX+xyq0kOyowDh\n2Z/k0VACPya0MK9ZDQdlDg78gcSgqFSDi86kIvIIZV26hz2W3y4gPzRdZ/DJ\nqcchDvdX5gJ4yP45mANwdSKB7//WdFBVUCt2e25ch5MawswX8B3TJwcypQkz\n/F/hZBnn8hIyXl3YdYx6L8Q4l4QvtgbttjeX0bMZf/tIphMXM4xGKH8ffr0H\nU+3r\r\n=GTVz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCUGIvpNu7dhOyobzG93IueZOo/C5GkpBFLstQDrO+Z/AIhAPwLq9jXNzHol1ZY4h9Gdbxtm288kYMJdpeuRgqSggsl"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905201435_1567714661742_0.9607398546840227"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905204635":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905204635","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190905142444","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190903201907","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"1.0.0-master.20190905203158","@atomist/sdm-pack-build":"1.0.6-master.20190903202948","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"d78c54c83d7688afc3d89b93539e61284bf52559","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905204635","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-97YPL9oXpr1MXTOkfn6hRckQy2rRI2lO2pFipH7RwZDbFkbFqo90xHqAKbSH7oQSv9pBlwpb/gHCk0SnRKgn+w==","shasum":"a1554d3c152da7636ed7d9dcf2db1de3a1447400","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905204635.tgz","fileCount":126,"unpackedSize":741357,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcXVaCRA9TVsSAnZWagAAITEP/0Ho7DvDAE3hgtI8OwUs\n+5ZeQEwT23KLTOVSlizP53X+xg9Jj8MzzvV1ISsHKfPbZ0Zpfaj8wjq7surP\ntOXNIntP3L0yhlSjm9Jl2TvlBbuIqDDF6SGDO42dyo60Npg/icj3JVBibHdx\nJdzAjR6cPj8+ZC3gzEMTJHL2RQy441NH9BGBzufLGtX4aXD/+j5hOF65/xD/\nmTK0a0GRaiOfr35cmzf8eXigski715a3eedNlbDsRqCEtpR/iFCqMQckHOrH\nN8rUnD7yGICHsKJt4mnEkac3XeWZT7lG5nXW+GnGuiC5IdnTzpzIabtK1JWm\nISTT7+TH6jrPcIchgi3yZC9BZbbk4PpaRZ0s0ENq+obqLLLp3COFVSIdU20z\ngp0FFZ1WIBZNYlpODNrCsTIc6pEINpR8dYG1gOZAMnewiL14vF5L1nJVn7Br\nMGdU2OLObHZt6F4xotr5mfBpofnHBH81JMaOjI/IDj9JcQGT074Spk9IDaj8\nHkpcnSYxoD58Lzph+5+r1hdwFcG3LxycK2vlJTC4IGNbjq8Xe+Z8w2F9s+1r\nQo3VVUbVaZTzwFkdASt001rCxC7INJ96Ue8ATLTSXibHonmMJRylj+9roiOf\nooqez3CV83W9qEqlQzFpBm733mnP/z1M3Ww3qaK9Xtt6wEtzQ8iDOeZ0bp30\nDvwm\r\n=c+jk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC76EjdDZKLVmLbHC9/6Do0qtVulIqmCCNgFvKBppJDywIgGtHsl+m016c5LHO958f5TEj56nUxmVOwpCWQMCuHDAQ="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905204635_1567716697582_0.17636525170692474"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905215815":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905215815","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190905142444","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190903201907","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"1.0.0-master.20190905203158","@atomist/sdm-pack-build":"1.0.6-master.20190903202948","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"77ce80cd56f1b09835ce091cf8148ff4068c8338","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905215815","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-EOIivQgSB3xtcQ6kmReENY1F8/3iMQyXUJQJTKUsdY6eI9F0miOyGpzLIJlXZuwOeJZWJErVLXH5vfzW1i62AA==","shasum":"2293fd7f354575a4b783ff017b0d4d510aad7bd6","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905215815.tgz","fileCount":130,"unpackedSize":746001,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcYXMCRA9TVsSAnZWagAAjH4P/0PBOJEhjVBHskqliiqx\n6rOYG91QhvE03cEQYYf5HHjddsxnE4PQb1rpJ+fdU578nLqS3leMWaW7Dhj7\nJqjVuQE2QqEb1VES/I2Iv78WAVJuh8pTE1aLw1wmpmsYAuu0czmaVXl8QVT4\n+8X7cYx5g+rQORJq0Npnoyu3zxgXAe4p3+8/l8b0vp41+ukeJarv2FQilr3D\nxXAIeR3p/EcgVqO6ZOFlb11FcDnShWQGOp76XTGox71XWiDc8L2mU4CX3H5c\nZjMsD1bqZsb1WWCwKfmL92i3xIigiea8z2pXkEEooT7ech6JYJPoOOa/t/gB\n7S4xyxvYeUoy5pVjLy6w1nTfOP7Yf4XT5QeXwjdUHg9xSy//NZmzKzDyVM6S\n5TRP1MVue3CqKA/TbmZD4Y5xt8lJgXuYAfcTTC+n7VO0h0ESjkmw31DO0SrI\nvqB9+8gpN6hOAH4SjPQKZnHq99aXF2VBd1ShyKgeqtfvua3v9U9SQOY3hsU1\ntKFmEBrzb4UJEmCAqMAJzNTa7ip9cS5hsrs0VjRPyqEFpCBU6TQXCEZl24xz\nXxY9FbIBQwkt4fOGll3sOSqB0LqPT3Q1JbSsMFud1MkYAEAzTPfjWr4MQkvV\nAHwcCzS9O6mU2sCdMnxbMPkrU4hFwSPVqGtfPvP3GNgzCIWZoa+QyO7lQKSE\naNpg\r\n=wP7Y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAPp/ZegoE7ZklB+W+fVGlioxND9E2ghvpNLPtWfHQFKAiEAxcaiqBTUqqH363DXOsTfJwde73ygUvJ4/urBs8mYlAA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905215815_1567720908198_0.009221707152969216"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905221548":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905221548","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190905142444","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190903201907","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"1.0.0-master.20190905203158","@atomist/sdm-pack-build":"1.0.6-master.20190903202948","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","@octokit/rest":"^16.28.9","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"92a37e04fc4af401c10297f9d28f1a751985e691","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905221548","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-dSb4s5Qibs+xx7T8yIkX/49NfftfSVtuH2OGraZ/cEKqnPphvsGcluAgpie5hNZu2NbI0J8YzDM/68PSeYxSQQ==","shasum":"402a61b3f7acde06eb73153b1b1f64a977ef9d31","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905221548.tgz","fileCount":130,"unpackedSize":746113,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcYnSCRA9TVsSAnZWagAAWr8P/02MLKH5Xpe1wiCwXSF6\nz+uL/+mSL5LytT4X1zSyb+lveov39C372tVUZpTjYTsRAblpGolZpFHetU2A\n+Q04FxqCrxhww5pooIE8qV7y9A3IwME6P6DqG4OzWOjdsl5xSe5byIMcU1Ee\n3U2/fSwWUgIuJivNkmeC3cMubXMPzq4LFs5aLJBG/B6yC5yY1WK9yPrwWIu5\n/FK43iv2RxftpYRtpnzPU7LKybDKrm3HScPbWM4OLYUDBVvtRIWDKvv7/92+\n2uaIp4qAJZ0kVhzN++0r8niBeeKNWjELEQ4MfbycpBb1oo7URCatecQZELyj\ngluZuY6AU/ap1laAptojhCg6b5Emrx6dNCgtoP4vpv8R6LQjl9E5v7agUVZ8\nGK1gfkmqSeIeatgjh7It2Yn6VZe4n6U58WgFc6M3U95SuDCsAVmThVc+o5/p\nTBafBwdGA7yvnENg5i8YWZ4x7IEt+7IW5L9alFMEuoBzyY+6PzGnVOo4j3cy\nZh8ymzcdx/lSZAQEqEHvi3YT9yyIg1n4pBNHdRJtCgLcykbbqYHKt//c1LsD\n1quP1Nn1SDN3T1CkBR8fd76/svN7Wvp+70NbZ3mLW5mCgGMvTKNB//d+VcEX\naPFRjWeDvuq/GtnDQ9HdkOepxxW1sB0jkT0V6ew0gLdw9I8Zno7y47qRpdPu\nxA5h\r\n=2yh8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCxDk3+MRwJ+1v4MOEftUuvRBHW40dWUvF9RFGETqecCAIhALbDzj1iVGdpkolXIHRdLrC+VDgFdAgX3JdfQdgd7Lpi"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905221548_1567721938266_0.3951635972206051"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905224738":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905224738","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190905142444","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190903201907","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"1.0.0-master.20190905203158","@atomist/sdm-pack-build":"1.0.6-master.20190903202948","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","@octokit/rest":"^16.28.9","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"96cc0633e74acc82f74ad9dcea911fee8481f5f1","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905224738","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-YH4lQi24i5+MfTSFnc/x858LBIcyRei/QwwHyGqwgjiKbcaOpwJRSXpXUH5QICm/MW+jp/RWxk42KQTXe4AnYw==","shasum":"68720502c3e727f8a0a0abc5e67f2b029d6ef0ee","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905224738.tgz","fileCount":130,"unpackedSize":746903,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcZF4CRA9TVsSAnZWagAAFicQAJjZoiJsnp/Fv0ZOsFoZ\nbclrhd+XallhgIjszkAdnW93P5SuU+URt1f8X/eBzJZaui2Io2vrVa4qSnyu\ncB6ZCekTT667tbjqoBeKBFhH4qvZJ5u3RbR/di1kN3zmF+5Vz36i6Z2RL5DG\nO8SOeLnuOHPYLAZsZEMBMV9hkv0BEDOIp3Ae8W4KX3POCx8oG6jTawLyn61/\nu4f+5dmsLnYkSjYP90Jn9DOa922JQfROCna0P5CFA8AwAQvKsSqwjv/t8VTo\n9JcBtRkfHtfbEUCImcbcRC0UNqw78dO4mw5guNYdNF+vkg+tYzQIhuaouWn7\npfYRA6xQT/aHu8I1jQ1LHWSF35cOT5gSHpYzPnozxbMnSB0o2gwI6gX3nlf+\ndpmGk3ad0czDhH7vlqZ7TODz1Wp3CU3+m8ckGpXzgC0SSIGkBdD0WRNjC201\nZ+JrIOQc1VsPB1dRcC3mPuwTnD20ZRGeCMSCKlOZrWqcg70LOTSpr+PYzC4+\nSl5jysl+pgKFbN4iBCNtvYUsc3xMx2GDZA0HCW5DdwHu+yukx/15nX5c0xHe\n3UxuhhfVY8x3NQp6jp0J1akZGDTTg4YSLve8xMK3pVWS6EMIgs2//t+N1fNt\nsgqg0pRnAiCaTG06Uaa+SnjjArMTatE4ajLDfCXWtxaRyL1aD28U82rvUtMV\n4rDU\r\n=WE0w\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC8jAo0uMYeHsxUtTSxN2qnuptzGpx1jDeKkVxqC0Sz0wIgTIGVPr0IGgF9FUo2miGy6zIU7PGr+Br0vVVG7RdNquU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905224738_1567723895348_0.23258623262781342"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905230619":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905230619","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190905142444","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190903201907","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"1.0.0-master.20190905203158","@atomist/sdm-pack-build":"1.0.6-master.20190903202948","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","@octokit/rest":"^16.28.9","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5eb20ba5c2f9b0f6d74d1be4671b8a6e013c50d3","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905230619","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-aU/oMY0jY6+BRi0duDEBKYxdFpfhJYMmRdSe30n4ppZW6hHN5cSl3+2cjUIhMkcc9z5njevHoaHSzJEzJmxzOA==","shasum":"e22dffe3dbd847a87a76e68332d2a669d0d811f3","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905230619.tgz","fileCount":134,"unpackedSize":750555,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcZXFCRA9TVsSAnZWagAAagsP/A/f8XmuYd97si3BRcZS\nTorzZsvnzrl8ky3Wu+IwB0zDl0IfiPJX+osqZqixOJGMr0yEdyOmHGFglYid\nPoPqVFgr59kKE625fGyGZxKc6pyt40eOBEea1vW5me5uKGGnqvgQjwS3G2KW\nBDt9VADpTPKUy1owf4HJmwFnZRbiM+POVfrKyat36LvMhm0b3poWqoASdGLn\nIvlr4UGT4kWupGteSVQulhGEeKEzK+ZdzbKnnzHwflPRx4Af/qAkLrEsaegP\nIRcgI9nkxigWaFntKhWS0U46TN79ZMk6o/8QaCFmQ/LSlTK6ni2SQ+Giyn//\n0OPegRMcn202TE6cNqrM/m3NnNH81kZidvgApe035ZKgs51ujgXkzmrbo9sk\n0zKNJMjadk43Ko2t+hN+HRMqjMJ/+gQX0at6JowIwqmogkh/bnEVbnaAdlCs\nhba49Hsiie7sqize3pBJR4/d+lSEKZn6191M9FCL2KRL3jyn70r87c+jqsaU\nTVbmbc3W6WOz4Lenvhz1LV6p9LlfH173fHscWGk8NyngNi3PSkPQBIbz/gyf\nKc863lAv519i+iSOxQ8vJRlPAff1hRGd7tnwNJ/YSbxswl2n0ZTVwt7kbeMi\npXrKFHIcNB20W0fUt7gGtd8KrJOfp/WPgHbGubGhMtxjk6ZJfw7jBvo69P4r\nnl7J\r\n=75kz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvgyCTKGIFiWNMQMg7a1G64TygJ07D7c8H1N+GY40u3gIgP22L7nVVJtFAmI4rXrxWA3awslgF3lYXFYtpY8o1cHc="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905230619_1567724996051_0.17473378705166298"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190905231718":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190905231718","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190905142444","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190903201907","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"1.0.0-master.20190905203158","@atomist/sdm-pack-build":"1.0.6-master.20190903202948","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","@octokit/rest":"^16.28.9","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b85a148c17fa1b8b91daf61612f15d5934bec326","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190905231718","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-4CI6E78tFE7k1blGeZ0VFJMtiCEIwtM2QiJ0eI4F/tkAt0spGPRYuyJvpprJ1MhH5auIHknXJ3SK1QXy70UCvw==","shasum":"4f63503a214e981516e432ebc96582f4faa8edea","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190905231718.tgz","fileCount":134,"unpackedSize":750660,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcZhICRA9TVsSAnZWagAAkjUP/j1nc3z+lbhsYGVz+R8i\nlwAOSXI1fkaG0RU2jS9wSqqN0oMpDmryfUy878ruUitvoH8nHOmq0WafP7Aw\neYw2O07XSIO0J0MZDbApEqSo/q0xj0Zts4L0pEfWEfh6gkjQOaQTvHmt/w7V\nFo/kLJW3HNxkeGQ2XL6WNJdCmYwfpJHnmGPeVYqaFBziI2nduxMNtiL489+I\njS8tbZheFUNS4o2to7Qex/xqeitfm45Jj8BfUoSb7grSx2EErappCdwKcpcd\n7f7u6NlrHIJPWt2KIgmNxacVM/iq8Uo+gDF1GcRR5D6HW5Cz5AS2KYcDU80h\nJxjC363xbnmNITFkolpsVjBW5kc2VTtArZQZ59SwtX/DBN//FxtilSHMqLJh\n76Xfwnr5B51zjNemmj9/ZfuHFB7YDiZO29OM8XafN5cfNyz56gTbVVqi/95e\nEkRV8ByFwZQv1it9iyTcqXMW/8ruWAgqKs+KdzvoGXnsIPDSv50bPXoVV9ZL\nP6p/VeuAq/gKQXk0eAwMBnLgvfFe3VkLAFnAgudFG61vB4895O+pvOMX4lk4\n8id9fT01x1mvBvYwfK1MFoXf4EDjm/PYbBOHDKzTY6Cd/wyuo5W6dPkBC2WH\nt6TGlxQjB9j2KPaL141EDhGIYP0GpJmX6XzwGaod/GkRWE3JUnqWDYB8OxGj\nBgDB\r\n=Mx9M\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkk8wKZna6L5tXBrnTml1wKfObBUYjBPyEPa2kVOZqZAIhANLMKEKxDNF2gBOl/KZev0SQ5LQy5Bde5UxTxL2SNwbY"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190905231718_1567725639364_0.6354278140077492"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190906010516":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190906010516","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190905142444","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190903201907","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"^1.0.0-master.20190905231019","@atomist/sdm-pack-build":"1.0.6-master.20190903202948","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","@octokit/rest":"^16.28.9","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c42e3e40bd419904694a58337c57eb6a93839e30","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190906010516","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-i49Egu9rGOXGuQL8yRHwVlLAErLvC5HwINLbLB+e2Ctw1fW4re/eMbW66zqJOjX/3XJCCE7JqtC7oXg4OynQNw==","shasum":"fcafe82f188fa3660943acdeda7af7adfaa5f5b0","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190906010516.tgz","fileCount":134,"unpackedSize":750022,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcbM/CRA9TVsSAnZWagAAUyUP/Rdymar3Gcq2bW2uWTVQ\nib24N3X5nDvaer9iIbvMTvtS9mj7lgph0IeHgslRBYPA/LJsdtTYiaUJiyhn\nwEI4+MxHI/ww1T3jvL5g7AI5pYGWotDxYFtn95t3+wDjpvwhoTPDJEG4Zw3k\nyGaB42YQsssrgPfJUDzPdX/D9P0L7Is/i0QAvpqYyq9pfH4RlihYmnO+EXqy\n1mS9KvNeBnw0uNfO96jG5AhrXZQDd6uz+g3zY5GiwecGpFnYX8gXT1VOfzdu\njjEb6Qdkf2ilbpNlqtSJcA/I8WZCCi5TTizaMqxp8V6cQMdekPALBYGsFsMo\nuHGPhYuYSLeMAbZEZjroqtIslvJI4zsc+16zmqqhTK1vjQ3wxTB4KhUSlHGL\nwcK3hP6DCd9ubuGD5GPpZfiGJzkO8LxuoF8+C77AzfZZYF1uSxr2k6RhGWYO\nslIkE+O0cmVJfyQSuZrWERCDSAmtMlNo+qebjJ9eMeqoJAkm/bs5YNhyCzTo\nMrKs5fK4VM5hHs8zjcIPR9ZDYkSQ6U22lr7nwrSz1fDplpCdB+14nzUQ7zg/\nGVCHc8nnpgZm6JUPYClyMDMlfSFuXszHNMZsq89JCRP6603uwq6FNj9i2I1M\nlTCw6HuWwiBVXCLA0Aw7dNCCSNihonWXiU1odmkLxCl9aC2p/AZO4NoxeDeN\nahz2\r\n=R9wD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEDANRWqY1gX6mx6B31c/T5nZ6QT9qk/WdMwiO5paYL6AiBFEyqlh29c4JRBr2pLO4kdMnqs+mTZ/aXPVwaQlAaObA=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190906010516_1567732543278_0.9921008720699707"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190906013138":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190906013138","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190905142444","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190903201907","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"^1.0.0-master.20190905231019","@atomist/sdm-pack-build":"1.0.6-master.20190903202948","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","@octokit/rest":"^16.28.9","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"5c55e91313297eb9120b819839d478718e5f656b","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190906013138","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-jCgTbWpHHTF//MDkyKPqSJkIW4h/hrN0+9ZkvZ760fgE9XoQaZDzPgA9g9kEXpKXfaE8gSWK2DqNq3dTlGWk1w==","shasum":"74d0652b4a2a2befe3f761f0fc1d5a89cb0efeeb","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190906013138.tgz","fileCount":134,"unpackedSize":749338,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcbgkCRA9TVsSAnZWagAAD4MQAI2grtbDn/0AWRV3C3hU\nFo7WLckrHbnX2YkpEoIRARzBKRQNpXlRAZBAC6WfNcKXCwOTxDYHmlg8XYqZ\nFvjy4GRc+LByJyqrzwKVRNq+/Jpsz22DE10Q/sFIccTQataE/gI3Nt/OhuIB\nOBNLA0532DVn5CNzTsSba/Bq1FcnbL6Du88LmJUAilSRfPgjHcpb8Yn3hAuF\nlRaDe99Top6TLAIPyuRb8vHwgSULt7dO+AS5Ai22KBw8AUvg5h9SYMBCWoQO\nF5y0FvMtXQ0NGEvx2Zt6ROuGSFpdPVhuOMt/6vepsN5/AOU2gR2kXszd5+rt\nhKXlw+iMtjNk5sxkhT5L10juRhrU8ypcFdymOQUESdFvvNpiaAobHjcR3okT\nILDMcZLC3KrEjvJ5e+D/EianSYfxBjwEDhQs+mffbcUICtE0ym6rDcS3C87y\nLfwaT/kaJg7SfweD65O2DF75EY1s1VRn7CV+vqFLGnIhnTH3rzWke9y4yeoH\nhi4CjAMbhgZK3d+WncnvvZv7aeSGem0aDBZ2sy2G6j+UEPlNVqqRFCM9h4uI\nvCCcHFS5HzRXr+Y3yXdcxqzsKDtucMUcJELpk3I2KHp8vM4Hku58kzA1CQdh\n5yw5/sxf5iUt+Z1qUpoT8a9lDvmyopHgfu8DpIU569Uwmc6ao1l5fsltKVJE\nkByo\r\n=FXDn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCt0fzX1aGyZkxbMNPgQU3ilI7zrrJoSEGmzcbKjylsawIgCYWmpGIItghIU9pfARrHcC1aiCtrzw9ocU5vNwKsFW0="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190906013138_1567733795191_0.5146612828501853"},"_hasShrinkwrap":false},"1.0.0-python2or3.20190906055855":{"name":"@atomist/org-visualizer","version":"1.0.0-python2or3.20190906055855","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"1.6.3-master.20190905142444","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"1.6.2-master.20190905161334","@atomist/sdm-core":"1.6.2-master.20190903201907","@atomist/sdm-pack-analysis":"2.0.0-master.20190820223220","@atomist/sdm-pack-aspect":"^1.0.0-master.20190905231019","@atomist/sdm-pack-build":"1.0.6-master.20190903202948","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-fingerprints":"5.0.0-master.20190903060131","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"^1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"2.0.1-master.20190903203948","@atomist/slack-messages":"^1.1.1","@atomist/uhura":"1.0.0-deps2.20190904214617","@octokit/rest":"^16.28.9","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.0","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.19.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"349f2751421e155ecbd1ba50c7d3032ca284c742","_id":"@atomist/org-visualizer@1.0.0-python2or3.20190906055855","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-MsPvT7yaVx7fT6gJdy9ZpjZi2CU0X3VebSQLueximPuH4b4m0qVanStHUIG2NMSuv/1ZnQ+FrkXDY9XcjRgyUQ==","shasum":"434b5c2c820b931e585b0f39fd51e978fb6043c1","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-python2or3.20190906055855.tgz","fileCount":134,"unpackedSize":749458,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcfb5CRA9TVsSAnZWagAAh5QP/A3BWz21WOuADhkaWjWq\nafKckCdQQbv5wnEv6M35H1DThp4jdYCRknO24C9VkQumYi1xfsqgi9VOjqkL\nGZplufar9AWCQhL470WDG+FTo0BBWibt/byAsHPUb1cbWMR+PrZTM0uSUraK\nilyU1l/jGgfppVs3ZwYrmFzuIwSwSNzinYuW5STTKkRXzliR6wkxwtTZiSTj\nUBmoT5H5FvcYildbKrcsvYGQiYcjKqZ5yMyQ30Lco3lLVsxgXcFFX4vxG1Fh\nBQ21lvqs8U/uLCkaleg6xo8Fbeq6z6MkkoJkplQq93KPIKbzitlHQ8GSDbuL\nYhSxBBtQpi3Hxpla9fn6DsrFAZh7caBkWXyKoOHytG/TVeh4DcVNtRTXgbnh\naCUQXALK/4dts1m7PVwnUfowHo/S8bE/oAB+YYtNtAkm7090VEYgywIGSo4k\n9ezxZDnWwQMHIfFjd2HQHwS5ryyufSVmdoFyFYovWACQBUUFN6Lsmr9uzwX3\nK6g55SkMLnMasru6OwlbK1dTDoVYWuQ+QRpk5Y/XlEhCdhSSJVRfE84K/QWD\n/sKBMGrz4pbAM5F44kVb6cE+tjBFfa0QojlaAYOTTdfowOo8gK6OhOqF1mgJ\nXBz0MRjFFA3dOQrEfuoIzlL7y3W45jrlN6s3nbv9vtP6h/AmaZEE+Uc+tDNq\nogn+\r\n=XnrW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDUpV1PC2Im9FJ2XIWkX5jfTcqnvDc4yis0jWraBMwSVQIgDCeMoO8ert+N/VrANCgxSxGD/mXjmRFPiwEMT1H5Nfk="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-python2or3.20190906055855_1567749880217_0.3592222577225266"},"_hasShrinkwrap":false},"1.0.0-atomist.a260p86nh.sdm-deps.master.20190910084552":{"name":"@atomist/org-visualizer","version":"1.0.0-atomist.a260p86nh.sdm-deps.master.20190910084552","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.7.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@atomist/sdm-pack-aspect":"1.0.0-master.20190903071348","@atomist/sdm-pack-build":"^1.0.6","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.1","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.1","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.20.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b2baafc2e1c286e0566d3f224dca0e492c9f62ca","_id":"@atomist/org-visualizer@1.0.0-atomist.a260p86nh.sdm-deps.master.20190910084552","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-fn1Vx5kVZPZLP+mwkKTCVTxpibKg36AN29W4Wfc9uK8pdvrPfuSpzZf2OLy1Opxw1lNunDGL4yDipn0PqnDhcA==","shasum":"1ffefdac9a068143c448aa27d4a2e69bf31949a4","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-atomist.a260p86nh.sdm-deps.master.20190910084552.tgz","fileCount":110,"unpackedSize":718021,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdd2QlCRA9TVsSAnZWagAAPCcP/1C26JIs4y3KeUglJCpR\nu0Yn4+MxVDQ1Ry+fhy5skldG4KpOzDcj1cMtvtVMnLWqNPtDG3UNQQi+lPcA\nIWJWs48WSypXI+OIiWi3uaxtFlNE+d4eBbrNmaFVyCvKAp7/WYA/qi2rZSlO\nNDRlZNMEWXl9rsR8hrD1iSx83t6ybJh0ovrX7xYhOuMozeY87S9pIWB1MaXK\n8r2yIw3H5ywMnldIb4xrXxSoebcwuI85P1TrUElSgaqVGkz9K2VTtmO9d6jT\nZ4GbvnYiez6eKHH2EJWOKLiGJ4tinUGWwkr3ZekUOMvEMccxqyx6UORWsI7b\nqElw5HysqJHijmMA6LC119dhLLWa0Ty6T5GU/xHG8+NXvUlVob65+SMCh76U\nBcfanliTm6+8aq7iOJx6FxrbkDtlaMvn+ynUabA/pt5c3kbteKnlea0esKAb\n6hDfMeomGs51y2C7gSwoeYw+xoJpBm5MRd6Tj/Sn3JtPba+LYOKTSPtJ9/vK\nahYJRo+zCiex5iGwkvzy7xHWOIKwmrPtg5GDsx7V1jIBojMSCJfeALTco5O/\nwU7ltxwQEwpd1Xcaw473trC/omDvmWm7/Y+sozb/ezw7rXEwG6amq4Fsh/IT\nV1BLVjG8wQCtpNksbuebojGm/vIIRH8Iy6kzCEQsUPqZq1dFbOx+7qs5WXH/\no+IN\r\n=Eyjy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFH656w5KWiC8fxVU7GpcEbamKnqj+B1GXYND80h261XAiEA+YPetGMyBXg8ylTPlyem5kqPcCA/liLAaO2+6zqI+Ps="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-atomist.a260p86nh.sdm-deps.master.20190910084552_1568105508287_0.1904661907677072"},"_hasShrinkwrap":false},"1.0.0-master.20190910091135":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190910091135","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.7.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@atomist/sdm-pack-aspect":"1.0.0-master.20190903071348","@atomist/sdm-pack-build":"^1.0.6","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.1","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.1","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.20.0","typedoc":"^0.15.0","typescript":"^3.6.2"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e93aa3d185955b9fc7196823e4d2cc12975117fb","_id":"@atomist/org-visualizer@1.0.0-master.20190910091135","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-8aOMpPqKb0Kr7zzlRhBgHLNdC0jRi9FCs8kR48GmeDs5ahcGniN0sui3cgQ7bMFttC3Qtg5Lo8qEcnSPl+bSrQ==","shasum":"ecd14cdae8b11834ee34dc71cadf5594f6116b47","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190910091135.tgz","fileCount":110,"unpackedSize":716251,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdd21cCRA9TVsSAnZWagAAVZsP/R5kj4R/aU04k9zDcXp/\na85TjT90wzgDtF/ARoj5Gn1R5ndSepspbsmyY6hZLBAq/WQeGV3qvMH6h74N\nYK+py4Rq0zLjgpJSy3r+GTG77Sn61DcrqEaS0BxBx+1Lhz/psB4/lFlBDwr0\n2/nssCsANOAXL/XEDXWLx35wqfauEIBAFe65gLAsmLNYH7zV/uCyVuMXiFIz\n6NKShDpGfaO/2ZRFb/FV4Td6dUbH9praJ2PsNOlLSSj+ET3Fo7xJyFNPl5i+\n2t98UDJRrjS3Iekc7DvtU07e0mFb9otfIopjgf2Jqo/CH0ccY0zFFc3/Y7Ln\nVu0/PabCP9X7kV7bj3EcxBD1zNLX/TNhTkyCwm+eJC1/sUu8HttZ6Q51Eaey\ngTbYOzZzVmmoSWc9+pxYtqwRYZlnmz4u0opz50vKks+wNDKPtdiDpBRr0H8S\nQ8DQjrR2A0P7cgI/1TUM7MhBLFhLxygJx4/8KU0diBjIa7psZimeverTUN9o\nDz+0eTOGUqdiUv2S5VGj3FIQPrOALciCkNaBgnwGETBwhKChJ0/pQpaBnDMf\nMXWRIZbrrYxCK9qtAJitOrin5IFMfUuMolbjDymmJ0xKt788Z1fnkeGWTGB0\nfU5hZSd+u/TdgmRK8Gw7kBAOAPdq77yVk+GLKerHWrbhrfiga/Q1yboZJVpP\nhBL0\r\n=De/Z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC59+RAWSRPB0XCqDWuHrFzOr+bjiaH+3iVb4FsyQdUyQIgJ5N5JEEistJnwYn4pqT3WP0+lMJqJQQHmy6/nflKB10="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190910091135_1568107868255_0.2511849877254635"},"_hasShrinkwrap":false},"1.0.0-atomist.a260p86nh.typescript-version.master.20190915203730":{"name":"@atomist/org-visualizer","version":"1.0.0-atomist.a260p86nh.typescript-version.master.20190915203730","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.7.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@atomist/sdm-pack-aspect":"1.0.0-master.20190903071348","@atomist/sdm-pack-build":"^1.0.6","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.1","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.1","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.20.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"c9d1a0f47fc2de7c49439576e1928f9e1e60933a","_id":"@atomist/org-visualizer@1.0.0-atomist.a260p86nh.typescript-version.master.20190915203730","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-GN5HGVGvHIQrH3ivyzeT8FRW1Qh9Kos6JkQgr5JeFp+vaOMV2p6QIbUT5PLNkkA+XELIak37qRxG/XmqmwRhFQ==","shasum":"216559dac72ca1651688acdcf4429f55709ed876","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-atomist.a260p86nh.typescript-version.master.20190915203730.tgz","fileCount":110,"unpackedSize":716325,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfqG3CRA9TVsSAnZWagAACCEP/A5O/VdF+hNQdg14JpRC\np2RCLoFpAEuprI8KdrIG67Z38y7YpN8ocW6PVq9kwAOMFROBJd9XKrvUwBA7\neivgfZ148unA7TAaff9hfWI5/Wc1EAiHNjca9UlfTpc6Ahy6HMpWmqyEWThB\nl24tnjmZiGE0FtxnYEHIS1ucG9tZ+Us8RIusIgfFkiHpH3JuslGerDjpzMFk\nkYNtEMT3rjtx8hXjd7Q8yRhpkqMj7u5TT8RNmei6wTLZvIzv5Sy76pLJHzva\nW/iEm9tISKYeEnkb20j0eRM/4NHRYtENhfaMOmNU538IjVY/aualmzDyhwNs\nz01pkJnmVjkvDwh2Q1QubDqsursj+76jhz9flOyVMAoX6hXRmSXy1rUpoe2t\neoPKTp56X/w7UPeh/dXkSeXGBfS19yw7nILE0fuDiZXMXVkfieEypli0yZQl\nKxAzEJYEcWq1ERj9pSt1nrI4q0s+V0900xz6lpTWDsZmIef1f6mBbgsxolxn\nvmw4wGzYkLJlP3vmIqVmb/uwpWURx5oKOg1enHfuj/NbthZRBFRnwJjY2Upi\nA8Tjl6sWgQwCTa83pjOFWnl83RIb9SLnh/ytKd3DznhKrWT6xWwFvT0pmV2N\nedEEktL5WUDkJNXsWRCtaNa47facn/YqbWjok7mrG3luw6VnG1McmLl85ZoX\n9azV\r\n=CPV4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDbqPQgZxrsnVEBfb70gqYHes8MeQS5X1+KcQ67JbPxhgIgdbajtBc489idiWu0M7QaKt9ZAaYKD4wLGdfMCSDhydU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-atomist.a260p86nh.typescript-version.master.20190915203730_1568580022834_0.3593742516720002"},"_hasShrinkwrap":false},"1.0.0-master.20190916025513":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190916025513","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.7.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@atomist/sdm-pack-aspect":"1.0.0-master.20190903071348","@atomist/sdm-pack-build":"^1.0.6","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.1","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.1","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.20.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"139dc96ef84a38e984c039ac07267ed7d723b540","_id":"@atomist/org-visualizer@1.0.0-master.20190916025513","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-0wfMen25OqOpwdoTVZVH5Yu4sS0Yu3rb/DT4wn70dSWupi+qxvHGAsH8yN2ZxkI52BqvTQZ3lQ9zr0833L4FzA==","shasum":"c13ebf49a34b49cae3b855bf033d5d39dc9b4c06","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190916025513.tgz","fileCount":110,"unpackedSize":716373,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfvzeCRA9TVsSAnZWagAAQ2EP/RAn5XpiLo6/OzTKftCE\ngHxYOLX2+0fGWsrn8+yE/SMHLEksFdlmSMkUpjkEXtXTX42OBYt4U6hG+za7\nPZbsLs7pVxvrsk5s7yQqFFzIeaBgO5v1VDwiiDLO03xBoi2PZMCipn6OyoZt\nBaMeHyLPaLAffpc40ARnxRm8n2fee0BcfsI7RzD1uTkE4nEj0KVW5ljmrJLP\n9PV6G+iAw/GAeK8RH3krIgW4oPn7rFj4XFrBw9ki111D/8SfZWy/ZuOeptFx\nEsr1gPzxDQCfYBFhdg80rPtIXNYQ9u1i6aSxgo1osClpFFZOfvwmGMLLqUTv\ngXXdkGvPWwrbZSPjjemTh3EibeeMo5oOVb5tLcdakdY4Thh/8NqoNVNKC4ci\nSO5ABjAA2vM4l+c6P8x8oiL5skVJv0yC083mpX0W0hHkq04+MxMd2ek9x8PI\nE9iVh80L5yd5KZwN9lCKe8WKhqG72hiBGPt+47JbWuuahwYRNlrlFDbDwh7R\nC0TNiFH2Gb3WsLRVtYL2PBcHQ5aEPQfG6P8iCxZHTZM8XDxRLWW7zLCzt7cL\n+HXznl3CiwiaNZb1RFsyw/6n03Uu19UBPPrNTXFMiqkOO+m10jBA5rRVMcZ+\ntRp7lSa3xRjCDjxjSSOeY1FKg/X08O+ezMXBNcUqepEa4hrv9+PasvkjAqrN\n6ol/\r\n=1JXg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIA2zKSPzZJ/iIR6V9a6J2FwxlGMhne3qp8wNsc24iu+YAiAILEsuRkDKJ8ohEI9a2ZklQDt8HLQx7RGIxVTtjqPd7w=="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190916025513_1568603358103_0.8344204374135828"},"_hasShrinkwrap":false},"1.0.0-master.20190917181336":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190917181336","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.7.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.0","@atomist/sdm-pack-aspect":"^1.0.0-master.20190917171204","@atomist/sdm-pack-build":"^1.0.6","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.1","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.1","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.20.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"070ec0141080f8d0a020ebd5a4882d5cbca2a093","_id":"@atomist/org-visualizer@1.0.0-master.20190917181336","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-AlS9rmRjzRP4NVoqCMvk9YJHslFWnOS1RhqKF4tm+0COnETQEmFV5OJvm94mNr/M514dcxBxu1xvooZ7ScZudw==","shasum":"8a213e2e6e606ff33ff4aed6593cd827cc42cdb9","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190917181336.tgz","fileCount":110,"unpackedSize":716885,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdgSWeCRA9TVsSAnZWagAAXMEP/3GH1i1/DVphdj5m09gs\nYK4zcX1lVmGavC/xEpvnd+ZBX6DLPvDovPA9wt+6/O6eo0N+Dag/bfeKcIhD\nfnFL89Ai1tcIcDbN35ON2iLQkUMdhXQ98sFfG3zd2WUAAkftKsp7cmMzJk41\nVSXSatE2pAyWebn4MwEkUtFk9ggcK/VQMnnNtyNhoeshJnBgvKKNTgTBQGVr\n0nvLZFB21/epKpWwNNO4GK5X8drRZsLxl37ZKgfB3oawpnte/JlxUfsaB5if\nocIMYwmAEqZETGXKf5M9rCh5o5/jS6JnELm5No3QWl9k+GqfqhLbypcPBBUb\nAA2bSH6AFJ2/W7/aRGqON+BPiMEyZ1YdAQjlAlz+g7LWRnnI5p7c5G4AFfE/\nNpTmrw1ZCYRsw7BdsmIDJiF9p+ta3F96rOUnE4hIaHlHJZkzfJTJPeCx+sM0\ntqgquNjx2DXrOzQrzg+jEvICqtJbz5BAIQ8ssticbgGzG7YoNG1XVGZ35zCq\nyIIroI4I665VsFgpWxXMUVAX6XYr9oFkjNz3RDLgwJuouY791o25z+U0oJi3\nvMU2tJYIdLmmwVyXVQqz6VKFrvTWKo5ENyzkXC3AVTSB9zYN78hE+pBQIAlG\nH00d4efH+vCd9J9t+c1MWiPe2WvVB8ySnlcEljehABU0fg+a7M7l4he8YSNP\nh+fi\r\n=Iq8n\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDnjS4ty/+EFWkFEVu8AeapWEU+Z2iuuyrVZN5hJo9rGAIhAKsrUMYqm0bNVZYsAdBw1VhSQLTnykClnHO3kmvMKXqG"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190917181336_1568744862194_0.10666156308629082"},"_hasShrinkwrap":false},"1.0.0-master.20190917184940":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190917184940","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.7.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.1-master.20190916023230","@atomist/sdm-pack-aspect":"^1.0.0-master.20190917171204","@atomist/sdm-pack-build":"^1.0.6","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.1","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.1","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.20.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+.\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"b2b61a93085ca895c5219bfdff2d08fd0b38b921","_id":"@atomist/org-visualizer@1.0.0-master.20190917184940","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-O/scazTmiLdwTIpS+YZ8EN0GkRYT/+WxvdUJr2ByIxT7W0z8nwQuQbNmM0tshD+S7OOrf4zR+O+QFhK33SLhgw==","shasum":"340f851c85fdbb8e8e58ce03a19755b944f30dc2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190917184940.tgz","fileCount":110,"unpackedSize":716929,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdgS37CRA9TVsSAnZWagAAEbIP/RaeXYXpPhFxgS1JznQ4\nJWk3HFj6UPxlwLtBrV8Ap41G4D+ZC7sgUxiLNUY47vtMXdKOC2ZBKy99dni1\nbuCpwGAX3SK+SH+LXmRFwCF1YtbQMd0ewcPCSIsNXPG5Y3ZlpN0c3cJri7h3\njG5nJG/tltTxboQlmAvjfTghY74oi12vXunneX3a2ibw8YLk3MPMj1VVvz5R\nApmt3f7TrFRwhyNol3V1N/4ENLU03/kHw6y71xfv0XLMoDkDI40QZUOf5dIm\n0fQo9keShWhAtPfXkFt8c4vx+lY/MQxoKgn9DaDsTsup2oMp4xq4RS6mnJoF\nLm/YS/z6JDd7+RAjKy4F1lSeODL+EI/xDCz5sa9pRH5kUFW78jLvMKNNyLbq\nk+C5ZH2qwJlHLCgw5yB2XgxhpKLqhTaVg7j07+grFb5IjSB7STCSrT7hck15\ncjo+pNilqpz5UAAjUwiUmp0tABoouJFHyLVJBqEuGHhYVdaJm1nM7Q2RhTBQ\n0Xex1YDjtL2Z9p4SFwCPsxG1YJoePiZm12nk/LQpy5bROEAvzHeZRXg/JuNc\ncaD8XVp4mduQ0Q2A5g4U8LWn7CcLu3vCynxaCOTQJMVrISBzypM+gaoFN1L/\nEd6Ob14ysUY3i5KsicYvWsjL0urOU4xdzo6TgvXo0Nw/apKfIlAARmlC9DDp\n/tbp\r\n=KoPP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDQzd/CKTAv6nj9z7k0IrrhG41MroceU9mVlXJRz5wzLgIhAPMTLA0Sqc4l5bVuvZCxCt2q+eVATvSVRNVXMCJbzd8s"}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190917184940_1568747002922_0.9933723950556319"},"_hasShrinkwrap":false},"1.0.0-master.20190930212527":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20190930212527","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.7.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.1-master.20190916023230","@atomist/sdm-pack-aspect":"^1.0.0-master.20190917171204","@atomist/sdm-pack-build":"^1.0.6","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.1","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.1","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.20.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running in Docker\n\nTo try this program without installing anything (except Docker), you can use the Docker image. Start org_visualizer in Docker, then send commands to get it to analyze repositories (on your computer or from GitHub), then look at the results in your browser.\n\n### Start the SDM in Docker\n\nRun this:\n\n`docker run -it --rm -p 2866:2866 -v /path/to/your/local/repositories:/root/atomist/projects --name org-visualizer atomist/org-visualizer`\n\nWhich means:\n\n`docker run` says to start up a container.\n\n`-it` says, keep it interactive in the current terminal.\n\n`-p 2866:2866` makes the SDM's web interface available outside the container.\n\n`--rm` says, remove the container after it shuts down. (I've never not wanted this option to `docker run`)\n\nThe `-v /path/to/your/local/repositories:/root/atomist/projects` part is optional. If you want to analyze repositories that exist on your computer, this will give the container access to them at `/root/atomist/projects`.\n\n`--name org-visualizer` lets you reference the container, as in the next section.\n\n`atomist/org-visualizer` is the name of the image on Docker Hub.\n\nDocker will download the image and then start up the SDM. The terminal will print a summary of the SDM when it's done with startup. This includes:\n\n```\n  SDM\n    Org Visualizer  started in local mode\n```\n\nand then some other stuff. You can also find the link to the web interface:\n\n```\n  Atomist Visualizations\n    http://localhost:2866/overview\n```\n\n(Ctrl-C will exit. But leave it running for the rest of this activity.)\n\n### Send analysis commands\n\nAnalysis is triggered at the command line. Use Docker to run the command line inside the container you just started.\n\nFor example:\n\n`docker exec -it org-visualizer sh -c \"atomist analyze github organization\"`\n\nHere, `docker exec` says \"run this command in the named docker container.\"\n\n`-it` makes it an interactive terminal command.\n\n`org-visualizer` is the name of the docker container, from the `--name` option to `docker run` above.\n\n`sh -c` says \"Here's a command to run in shell\"\n\n`\"atomist analyze github organization\"` is the shell command to run, in quotes. Here, it's requesting an analysis of a GitHub\norganization. It'll prompt you for the name of the organization.\n\nFor other analysis commands to run, see [below](#analyze-your-repositories).\n\n### Look at the results\n\nFind the interface at: http://localhost:2866/overview\n\nWhen you want to modify this program to make your own aspects, proceed with running this app on your laptop.\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+. You'll need node and git. For `npm ci`, You'll also need developer tools like python, make, etc. On a Mac, that's XCode command line tools. On ubuntu, that's `sudo apt-get install build-essentials.`\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command after\nstarting your local PostgreSQL server:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n#### Prerequisites\n\nEither [run the org_visualizer in Docker](#running-in-docker) or:\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"824127a192261567a2b23aed31ccb9ec57eb6877","_id":"@atomist/org-visualizer@1.0.0-master.20190930212527","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-JjtdVLopdnxOH3yG06SI4rSwIOk/NkxgqAHFspUgpH9yWM/mgW5HGzN5wtZ8yCoXN1SrjCsc2/FL2Vf0yivSyQ==","shasum":"fe78a0c8b8af6dc38f27c5255404b0c44945d527","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20190930212527.tgz","fileCount":110,"unpackedSize":721076,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdknZOCRA9TVsSAnZWagAADgkQAIQutbKidQYQkLPmeX73\nJks7hiLYFGMQK/GDQqJRJwaewDkitkdBo2WH1IV3fOVF+1VnoZ+17Su75a0M\nuzYZ+XzkzC+YhJO4/F7OemcoY/Qnn7ByvEOXFYRpWMj3XaHRndQC0qG4wYfP\nB0uygRsyj+wI+bXpNW/Zbx1T9DlToYUgZT8ELJqHDYQ9kVuLbz8v8BInO0mm\nQhCuQr7xjafNwZ+i3vzxeJvy8sa4xoexa5ZHlMc+MpyzoAokqQN2FaqGifwq\nZbEtFgX9xNzq/VM3XaB/YZNB3cXMXdqsse/gC+fenfmSboeKWfIdSwetBm+I\n8B/CRUhx9R1htP9YOyxOiHtMA94udkyPzIZrDv0hX3grTnJCSN6kXnkjBlWd\nm0ZlOwDLPpppAnrBjfO5CWy4kFRfYJ78Gdp3o+RurwHhkodQh4Uepg5rB9Iq\nwr+xW4dnRrDTYwgH+ColBd+DE2iMn0S76eA7CFBFIDrDeXziIiZypxv7U0AD\np6gCeim/Lj2KpjNLRFlJJ/CFYUQtrlJi/eeU2WVTLIbYx0a/xQ2ivQVUkW5S\nF81vUfJYlMRAgGXee0BFBZFns1m73D8J+ROHUwSHD+SD3W6PILmQrFTmTSdq\nb248HuRkA1Mvn+aUazysIoroEPjwJLLSc9LqBtDOSoVeS5oTnYBN7rOP9kRl\nt1La\r\n=MayX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCj+nT++P23RYZVx72ZYz/ssZ3r2R3GNt9D29bKbxbTWwIgZKDb/JPERdbNVS8QQLcM9fvfOZH/Tt6uLZkoOKk/yOA="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20190930212527_1569879629736_0.2556085687824001"},"_hasShrinkwrap":false},"1.0.0-master.20191021162016":{"name":"@atomist/org-visualizer","version":"1.0.0-master.20191021162016","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.7.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.1-master.20190916023230","@atomist/sdm-pack-aspect":"^1.0.0-master.20190917171204","@atomist/sdm-pack-build":"^1.0.6","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.1","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.1","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.20.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running in Docker\n\nTo try this program without installing anything (except Docker), you can use the Docker image. Start org_visualizer in Docker, then send commands to get it to analyze repositories (on your computer or from GitHub), then look at the results in your browser.\n\n### Start the SDM in Docker\n\nRun this:\n\n`docker run -it --rm -p 2866:2866 -v /path/to/your/local/repositories:/root/atomist/projects --name org-visualizer atomist/org-visualizer`\n\nWhich means:\n\n`docker run` says to start up a container.\n\n`-it` says, keep it interactive in the current terminal.\n\n`-p 2866:2866` makes the SDM's web interface available outside the container.\n\n`--rm` says, remove the container after it shuts down. (I've never not wanted this option to `docker run`)\n\nThe `-v /path/to/your/local/repositories:/root/atomist/projects` part is optional. If you want to analyze repositories that exist on your computer, this will give the container access to them at `/root/atomist/projects`.\n\n`--name org-visualizer` lets you reference the container, as in the next section.\n\n`atomist/org-visualizer` is the name of the image on Docker Hub.\n\nDocker will download the image and then start up the SDM. The terminal will print a summary of the SDM when it's done with startup. This includes:\n\n```\n  SDM\n    Org Visualizer  started in local mode\n```\n\nand then some other stuff. You can also find the link to the web interface:\n\n```\n  Atomist Visualizations\n    http://localhost:2866/overview\n```\n\n(Ctrl-C will exit. But leave it running for the rest of this activity.)\n\n### Send analysis commands\n\nAnalysis is triggered at the command line. Use Docker to run the command line inside the container you just started.\n\nFor example:\n\n`docker exec -it org-visualizer sh -c \"atomist analyze github organization\"`\n\nHere, `docker exec` says \"run this command in the named docker container.\"\n\n`-it` makes it an interactive terminal command.\n\n`org-visualizer` is the name of the docker container, from the `--name` option to `docker run` above.\n\n`sh -c` says \"Here's a command to run in shell\"\n\n`\"atomist analyze github organization\"` is the shell command to run, in quotes. Here, it's requesting an analysis of a GitHub\norganization. It'll prompt you for the name of the organization.\n\nFor other analysis commands to run, see [below](#analyze-your-repositories).\n\n### Look at the results\n\nFind the interface at: http://localhost:2866/overview\n\nWhen you want to modify this program to make your own aspects, proceed with running this app on your laptop.\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+. You'll need node and git. For `npm ci`, You'll also need developer tools like python, make, etc. On a Mac, that's XCode command line tools. On ubuntu, that's `sudo apt-get install build-essentials.`\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\nTo skip this section, [run in docker](#running-in-docker).\n\n#### Install PostgreSQL\n\nRunning locally requires a local database. This gives you a handy window into the data as well, if you're comfortable with SQL databases.\n\nOn a Mac: installing [PostgresApp](https://postgresapp.com/) will make all of this just work.\n\nOtherwise, you need the following (example commands are for Ubuntu):\n\n* postgresql is installed: `sudo apt-get postgresql postgresql-contrib`\n* the server is started, and listening on the default port: `sudo service postgresql start`\n* your username also has a database user, and that user is superuser: `createdb $(whoami)`\n* your username can also connect with a password. See [Connecting](#connecting-to-the-database) for where to put that.\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password>\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n#### Prerequisites\n\nEither [run the org_visualizer in Docker](#running-in-docker) or:\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"e3e1af6d1908c6e08e655631447eb4cb5810acb9","_id":"@atomist/org-visualizer@1.0.0-master.20191021162016","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-LWXLyxgUSd7bvWDUbEa+Dj46qD7Nia5J3GsSCdb6wpByRJxbpStWsIk/gYxZO07NyxbSs+A8vjZTaYLB4okvqg==","shasum":"6a5d64552fd61dd73c81c2f8875fbb314c3e3ebb","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-master.20191021162016.tgz","fileCount":102,"unpackedSize":714041,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdrdyCCRA9TVsSAnZWagAAOwEP/iUxp2XNw+G3sFDOjrkC\ngUMCmG60HFH3psgPC+jlJscVavHOSNNLnFaJUyFP/9I+EPbU6sjU05/PYSd+\nlWCSbgMZyMj74srBYljksUnjGBbEGnqSSQy843FVW9JubD+FIy2ZDfDMEu1R\nBULFcgyAbeVtvOyNfImFICfvE8u6AjDBriAOLxe8pCxTPRJicW9631fYcZcO\nQfyAbx4hvR3ElpAvyA+J7VE2nSiOmiLFi8tAucI3OUJf/+nLeq/EmBsjt4FP\nO7ehzJz2IaOeCzbbo5UgeaPjPpOQs2wFLGjswtD0+MIwTL0KX6nF4HCwqyFP\n0/mZ4CJ404vWDirdiRxznCrmSDnbtsVMMun/Uj+Rhy4az5Y6btUEV92IBh9Y\n1KKtzl4uPRJEcsDC6fZMUxb/d2K82z7vmBmUhoB/SN0ky21g2WOhS3iRQxEo\nf1BZZnbpGFZBGdHFNBgbTX+G/wmFJXpqxTegqWbW1NtD4PvajSpwkcnOuVdq\nygz8DytXZorqDlhRRyvX+Atcnvcfqk2kk5ugAURHgTYgcBRgwkifkh/vz/O1\nNBI+3seulJLSfZjHvh8EFF/AKP5sAplm+L/Ap7mCbFjsZsVCDcTkXCBn69Q/\nysYZhpGh9meNIRE2V+NKSraTPWKqTuxkC2ylcGEvI1ijNv1R/xP2T1TimLrn\nnICQ\r\n=xEOc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGRXWwSM69QMSHyYWVOEqEDPi3Eq3F7IGRhmlc1H0yQZAiEA6h26EMb8vxfEBO1Ul1q/KSlqvgbgteG5KlDfBw2t/WE="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-master.20191021162016_1571675265344_0.7015797508360786"},"_hasShrinkwrap":false},"1.0.0-fp-workspace-migration.20191105214915":{"name":"@atomist/org-visualizer","version":"1.0.0-fp-workspace-migration.20191105214915","description":"Organization Visualizer using Atomist project scanning","author":{"name":"Atomist Inc."},"license":"Apache-2.0","homepage":"https://github.com/atomist/org-visualizer#readme","repository":{"type":"git","url":"git+https://github.com/atomist/org-visualizer.git"},"bugs":{"url":"https://github.com/atomist/org-visualizer/issues"},"keywords":["atomist","automation","sdm"],"main":"./index.js","types":"./index.d.ts","dependencies":{"@atomist/automation-client":"^1.7.0","@atomist/microgrammar":"^1.2.1","@atomist/sdm":"^1.7.0","@atomist/sdm-core":"^1.7.1-master.20190916023230","@atomist/sdm-pack-aspect":"^1.0.0-fp-workspace-migration.20191102182214","@atomist/sdm-pack-build":"^1.0.6","@atomist/sdm-pack-clojure":"2.0.1-master.20190903063949","@atomist/sdm-pack-docker":"2.0.3-master.20190903064256","@atomist/sdm-pack-fingerprint":"5.0.0-master.20190903062633","@atomist/sdm-pack-node":"^1.1.1","@atomist/sdm-pack-sloc":"1.0.3-master.20190502175705","@atomist/sdm-pack-spring":"^2.0.1","@atomist/slack-messages":"^1.1.1","js-yaml":"^3.13.1","json-stable-stringify":"^1.0.1","lodash":"^4.17.15","yamljs":"^0.3.0"},"devDependencies":{"@atomist/sdm-local":"^1.2.1","@types/mocha":"^5.2.7","@types/power-assert":"^1.5.0","espower-typescript":"^9.0.2","mocha":"^6.2.0","npm-run-all":"^4.1.5","power-assert":"^1.6.1","rimraf":"^3.0.0","supervisor":"^0.12.0","ts-node":"^8.3.0","tslint":"^5.20.0","typedoc":"^0.15.0","typescript":"^3.6.3"},"directories":{"test":"test"},"scripts":{"autotest":"supervisor --watch index.ts,lib,test --extensions ts --no-restart-on exit --quiet --exec npm -- test","build":"run-s compile test lint doc","clean":"run-p clean:compile clean:test clean:doc clean:run","clean:compile":"rimraf git-info.json \"index.{d.ts,js}{,.map}\" \"{lib,test,views,public}/**/*.{d.ts,js}{,.map}\" lib/typings/types.ts","clean:dist":"run-s clean clean:npm","clean:doc":"rimraf doc","clean:npm":"rimraf node_modules","clean:run":"rimraf *-v8.log profile.txt log","clean:test":"rimraf .nyc_output coverage","compile":"run-s git:info gql:gen compile:ts","compile:ts":"tsc --project .","doc":"typedoc --mode modules --excludeExternals --ignoreCompilerErrors --exclude \"**/*.d.ts\" --out doc index.ts lib","git:info":"atm-git-info","gql:gen":"atm-gql-gen","lint":"tslint --config tslint.json --format verbose --project .","lint:fix":"npm run lint -- --fix","start":"atm-start","test":"mocha --require espower-typescript/guess \"test/**/*.test.ts\"","test:one":"mocha --require espower-typescript/guess \"test/**/${TEST:-*.test.ts}\"","typedoc":"npm run doc","db:create":"psql --command \"CREATE USER org_viz WITH SUPERUSER PASSWORD 'atomist'\" && createdb -O org_viz org_viz && psql -f ./node_modules/@atomist/sdm-pack-aspect/ddl/create.ddl org_viz","db:delete":"psql --command \"DROP DATABASE org_viz\" --command \"DROP ROLE org_viz\""},"engines":{"node":">=10.0.0","npm":">=5.0.0"},"readme":"  <img src=\"./images/dockerImageSunburst.png\"\n  width=\"130\" height=\"130\" align=\"right\" />\n\n# @atomist/org-visualizer\n\nA tool for visualizing technology usage and drift across an organization. \n\nThe cloud native era has led to an explosion of repositories, which we lack tools to understand and manage at scale. See Rod Johnson's blogs [This Will Surprise You](https://blog.atomist.com/this-will-surprise-you/) and [What's Lurking in Your Repositories](https://blog.atomist.com/whats-lurking/) for further discussion.\n\nAn Atomist **aspect** captures a concern in code or process. Aspects can access anything held in git: code and configuration and git data such as branch counts and committer activity. With the Atomist event hub, aspects can also capture data from your process, such as the characteristics of a push, build time and outcome.\n\nAspects support the following use cases:\n\n1. *Visualization* (all aspects): See usage and drift across your organization.\n2. *Convergence* (some aspects): Help drive code changes to achieve consistency on an ideal state of an aspect, such as a particularly version of a library.\n3. *Reaction to change* (some aspects): React to changes in aspect usage within a project: for example, to a library upgrade, removing a Spring Boot Security starter or exposing an additional port in a Docker container.\n\nThis project focuses on the visualization use case. Visualizations are exposed via d3 sunburst charts and via a REST API returning JSON documents.\n\nThere is out of the box\nsupport for investigating the following aspects of your project:\n\n- TypeScript version\n- Spring Boot version and starters (with Maven)\n- Docker base images, Dockerfile path and exposed ports\n- Java build tool (Maven, Gradle)\n- Library versions (npm, Maven, Python)\n- Inclusion of a code of conduct\n- Common CI tools\n- git activity and branch count\n\nThis repository also serves as an incubator for aspects that may graduate into other Atomist open source projects.\n\nAnalysis is extensible using the Atomist `Project` API. Implementing and registering additional aspect result in additional visualization links after re-analysis and restarting the application.\n\nAn example visualization, showing Docker images used across two GitHub organizations:\n\n![Docker image visualization](images/dockerImageSunburst.png \"Docker image drift\")\n\n## Running in Docker\n\nTo try this program without installing anything (except Docker), you can use the Docker image. Start org_visualizer in Docker, then send commands to get it to analyze repositories (on your computer or from GitHub), then look at the results in your browser.\n\n### Start the SDM in Docker\n\nRun this:\n\n`docker run -it --rm -p 2866:2866 -v /path/to/your/local/repositories:/root/atomist/projects --name org-visualizer atomist/org-visualizer`\n\nWhich means:\n\n`docker run` says to start up a container.\n\n`-it` says, keep it interactive in the current terminal.\n\n`-p 2866:2866` makes the SDM's web interface available outside the container.\n\n`--rm` says, remove the container after it shuts down. (I've never not wanted this option to `docker run`)\n\nThe `-v /path/to/your/local/repositories:/root/atomist/projects` part is optional. If you want to analyze repositories that exist on your computer, this will give the container access to them at `/root/atomist/projects`.\n\n`--name org-visualizer` lets you reference the container, as in the next section.\n\n`atomist/org-visualizer` is the name of the image on Docker Hub.\n\nDocker will download the image and then start up the SDM. The terminal will print a summary of the SDM when it's done with startup. This includes:\n\n```\n  SDM\n    Org Visualizer  started in local mode\n```\n\nand then some other stuff. You can also find the link to the web interface:\n\n```\n  Atomist Visualizations\n    http://localhost:2866/overview\n```\n\n(Ctrl-C will exit. But leave it running for the rest of this activity.)\n\n### Send analysis commands\n\nAnalysis is triggered at the command line. Use Docker to run the command line inside the container you just started.\n\nFor example:\n\n`docker exec -it org-visualizer sh -c \"atomist analyze github organization\"`\n\nHere, `docker exec` says \"run this command in the named docker container.\"\n\n`-it` makes it an interactive terminal command.\n\n`org-visualizer` is the name of the docker container, from the `--name` option to `docker run` above.\n\n`sh -c` says \"Here's a command to run in shell\"\n\n`\"atomist analyze github organization\"` is the shell command to run, in quotes. Here, it's requesting an analysis of a GitHub\norganization. It'll prompt you for the name of the organization.\n\nFor other analysis commands to run, see [below](#analyze-your-repositories).\n\n### Look at the results\n\nFind the interface at: http://localhost:2866/overview\n\nWhen you want to modify this program to make your own aspects, proceed with running this app on your laptop.\n\n## Running\n\nTo visualize your GitHub or local repositories:\n\n1. Clone and build this project\n2. Set up the required PostgreSQL database\n3. Start the `org-visualizer` software delivery machine\n4. Run analysis on your repositories via the Atomist CLI\n5. Hit the web interface at [http://localhost:2866](http://localhost:2866)\n6. If you have more ideas, add code to study more aspects of your projects\n\n### Building\n\nPlease use Node 10+. You'll need node and git. For `npm ci`, You'll also need developer tools like python, make, etc. On a Mac, that's XCode command line tools. On ubuntu, that's `sudo apt-get install build-essentials.`\n\nFirst, install with `npm ci`.\n\nNext, build with `npm run build`\n\n### Database setup\n\nTo skip this section, [run in docker](#running-in-docker).\n\n#### Install PostgreSQL\n\nRunning locally requires a local database. This gives you a handy window into the data as well, if you're comfortable with SQL databases.\n\nOn a Mac: installing [PostgresApp](https://postgresapp.com/) will make all of this just work.\n\nOtherwise, you need the following (example commands are for Ubuntu):\n\n* postgresql is installed: `sudo apt-get postgresql postgresql-contrib`\n* the server is started, and listening on the default port: `sudo service postgresql start`\n* your username also has a database user, and that user is superuser: `createdb $(whoami)`\n* your username can also connect with a password. See [Connecting](#connecting-to-the-database) for where to put that.\n\n#### Creating the Database\n\nData about your repositories are stored locally in a PostgreSQL database.\n\nBefore starting to use `org-visualizer`, you need to create the required database by running the following command:\n\n```\n$ npm run db:create\n```\n\nTo clean up and remove the database, run:\n\n```\n$ npm run db:delete\n```\n\n#### Connecting to the Database\n\nFor anything other than the default PostgreSQL [connection parameters](https://node-postgres.com/features/connecting) and db `org_viz`:\n\nConfigure the PostgreSQL database details in `client.config.json` in your `~/.atomist`:\n\n```json\n{\n  \"sdm\": {\n    \"postgres\": {\n      \"user\": \"<postgres user>\",\n      \"password\": \"<postgres password>\",\n      \"host\": \"<postgres host>\",\n      \"port\": \"<postgres port>\",\n      \"database\": \"org_viz\"\n    }\n  }\n}\n```\n\nIf `~/.atomist/client.config.json` does not exist, create it with the above content.\n\n### Other Dependencies\n\nYou will need the following installed on your machine for the out of the box aspects to work:\n\n- The `git` binary.\n- Java\n  - A JDK (*not* a JRE)\n  - Maven - `mvn` must be on the path. \n- Node\n- npm\n\n`git` is always required. Java or Node binaries are required only if working with those technologies in the projects you are analyzed.\n\nAll artifacts referenced in Maven or Node projects must be accessible when the analysis runs. You can check this by manually running `mvn` or `npm i` on the relevant projects.\n\n### Analyze your repositories\n\nThe `analyze` command is exposed by this org-visualizer project.\nIt works as at Atomist command, which runs through the `atomist` CLI.\n\n#### Prerequisites\n\nEither [run the org_visualizer in Docker](#running-in-docker) or:\n\n* install the CLI: `npm i -g @atomist/cli`\n* start the org_visualizer (in the org_visualizer project): `atomist start --local`\n\n#### GitHub\n\nTo analyze a GitHub organization, run the following command:\n\n```\natomist analyze github organization\n```\n\nEnter the GitHub owner name (e.g., `atomist`) at the prompt. Alternatively you can specify the owner parameter as a CLI argument to skip the prompt, as follows:\n\n```\natomist analyze github organization --owner atomist\n```\n\n_To access private repositories, ensure that your GitHub token is available to \nNode processes via a `GITHUB_TOKEN` environment variable._\n\n#### Local directories\nTo analyze local directories, wherever they were cloned from, specify the full path of the parent directory of the repositories, as follows: \n\n```\n atomist analyze local repositories --localDirectory /my/absolute/path/\n\n```\n> The directories must be `git` projects.\n\n#### General\n\n>Run `atomist analyze [local|github]` with `--update true` flag to force updates to existing analyses. Do this if you have updated your analyzer code. (See *Extending* below.) \n\nUse the `--cloneUnder [dir]` option to supply a stable directory under which all cloning should be performed. This will make subsequent analysis runs quicker.\nOtherwise, temporary files will be used.\n\n>If using a stable directory, make sure the directory exists and is writable\nby the `org-visualizer` process. And keep an eye on disk usage, as these directories\nare not transient and will not be deleted automatically.\n\n### Run the web app\n\nWhen the server is running with `atomist start --local`, you can see the visualizations.\n\nGo to [http://localhost:2866](http://localhost:2866).\n\n## Lifecycle\nAtomist aspect functionality isn't limited to analyzing repositories. It is intended to be built into your delivery process, via an [Atomist SDM](https://github.com/atomist/sdm). This will ensure that your analyzes are always up to date, and that fingerprints can be extracted by delivery events such as builds.\n\n### Fingerprinting on Push\nThe `org-visualizer` open source server is an SDM, meaning it can react to delivery events in repositories it manages. Running locally, it works with directories under a given base directory (by default, `~/atomist/projects/`), in which Atomist git hooks have been introduced.\n\nPlease refer to the `atomist clone` command for further information.\n\nThis SDM reacts to any push to the default branch of any managed repositories, calculating fingerprints.\n\n### Delivery events\nAtomist is designed to work with a wide range of events, not merely pushes. \n\nThis SDM reacts to pushes of Maven projects and will attempt to build them, in order to trigger the [build time aspect](https://github.com/atomist/sdm-pack-aspect/blob/8457fd82fe8027e143f217dc62ded8ad50a622dc/lib/aspect/delivery/BuildAspect.ts#L71) that demonstrates the intersection of aspects with the delivery process. As your projects build, build time information will appear on the `org-visualizer` dashboard.\n\nThe build goal is set in [index.ts](https://github.com/atomist/org-visualizer/blob/d99fdefd9d2331b14848dc8e666a05aef250f5f4/index.ts#L107) by the following code:\n\n```typescript\nreturn {\n    // Fingerprint every push to default branch\n    fingerprint: {\n        test: ToDefaultBranch,\n        goals: pushImpact,\n    },\n    // We know how to build Maven projects\n    build: {\n        test: IsMaven,\n        goals: build,\n    },\n};\n```  \n\n> Atomist is a powerful delivery orchestration engine. An SDM can coordinate other tools, automatically fix code. See [Why You Need an SDM](https://the-composition.com/why-you-need-a-software-delivery-machine-85e8399cdfc0). See the [Atomist samples repository](https://github.com/atomist/samples) for examples of SDM configurations.\n\nWhen using the Atomist service, event handling is automatically handled for repositories on GitHub, BitBucket or GitLab.\n\n## Architecture\n\nThere are three architectural layers:\n\n1. **Fingerprint extraction**. This is enabled by implementing [Aspects](lib/aspect/aspects.ts). Aspects know how to take **fingerprints** (extractions of small relevant bits) of the code, compare them, and even update them. Analysis is triggered by `atomist analyze` or by an SDM in response to a push.\n2. **API** layer. Once your server is running, see the Swagger API documentation at [http://localhost:2866/api-docs](http://localhost:2866/api-docs)\n3. Simple **UI** using static React and d3 exposing sunburst charts based on the API.\n\n## Extending\n\nThis project includes some well known aspects but it is intended for you to add your own.\n\nDo this by updating the `aspects` function defined in the [`aspects.ts`](lib/aspect/aspects.ts) file. Simply add aspects to this array:\n\n```typescript\nexport function aspects(): Aspect[] {\n    return [\n        DockerFrom,\n        TypeScriptVersion,\n        //... add your aspects here\n```\n\n>After updating your code you will need to rerun existing analyses. Run `atomist analyze [local|github] --update true` again to force updates on existing data.\n\nSee the [developer guide](https://github.com/atomist/sdm-pack-aspect/blob/master/docs/developer.md) for more information.\n\n## Next Steps\nThe [Atomist](https://www.atomist.com) service keeps analyses up to date automatically across all your repositories. It can also help to achieve consistency and convergence in eligible aspects by updating projects, and enabling workflows on change.\n\nSee [https://atomist.com/developer.html](https://atomist.com/developer.html) for further information.\n\n-----\n\nCreated by [Atomist][atomist].\nNeed Help?  [Join our Slack workspace][slack].\n\n[atomist]: https://atomist.com/ (Atomist - How Teams Deliver Software)\n[slack]: https://join.atomist.com/ (Atomist Community Slack)\n","readmeFilename":"README.md","gitHead":"01312aab99397af6cd1e755fc2f27e3154ebac59","_id":"@atomist/org-visualizer@1.0.0-fp-workspace-migration.20191105214915","_nodeVersion":"12.8.0","_npmVersion":"6.10.2","dist":{"integrity":"sha512-AVn+1aoOC1ZbpQaQFJapVxrbBvLADYgHmI+HsypaspOEuSQJVjCWY0XAPS6+SjB5WVKMKVg6hkCQAgjZ71wDpQ==","shasum":"bc5169d7b7c1293afb53fc71c1e9033f640527a2","tarball":"https://registry.npmjs.org/@atomist/org-visualizer/-/org-visualizer-1.0.0-fp-workspace-migration.20191105214915.tgz","fileCount":102,"unpackedSize":712384,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdwe77CRA9TVsSAnZWagAAJxIP/2IyPJ2X8zBfczo/yGbj\nj3q3zMm760P5v7vPezA1t4GZHa07HwNynZK6LhG/lAA4arjzAjvLCi8kJ4U0\nlkTh+wVh2jbmP91ApxIhatiyGYmwBhQaqX3GusGrLJ4fiD9n8w0HgVmpODea\nlQMH78NhqZi88YOrwRVBsGkD2uzg4CWmgO8613IKPFX7HMor10kk4Y+5iR6P\nTQ2B/MCEhdqjymIJFYVR2oEn8IQHf6PUjbsGxR4s230JQ9l8O2f113HewMhy\ngWMPGStcFd+praW5/6GJL46EswUIBGQOvQ2XtVk04pXBT0bRonCMbS8r2nb/\nHJZjF5bf2GIwuIhsdPulyZkYkMJIOlrTglPwnA/KDqbD3R/0k5WxP+CQO1S6\neBs8NBqxjzvneHSHvEkIc09k9g716COU/Nx+LDlWpnNCaV89/rkek4lPkO/3\nNrNTN80xy/HZAyH2+/Vl5d9FMaCdqxYJ9tej4XY0HD/7seXGOJ2/zyjUOdU8\nk0pcoqBfKxKFbeJlKynoxROEWb/KsL7QRknNYK2s3kAbsijABDv4dV5qAvET\nr9Xk+SKJPR1/K8qBFSHB7w94BuMbsTf9qjZXNFPBnR/zI31dwXtWsiI9qOj1\nBY2LCNiVW8Moq3HKFfO3WKIS7Qn01a8BYkz+iwXgpuLNzlCEWtwqQo5fp3VB\nt/Ry\r\n=gXZw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC7EdI6vXgoGsyKuiSI8Z+rJPV3nTH3hK2dLK2G3AS8pQIgGCZt0/+Dc65zvBD6qtBpTllZkqgqnGZk0ZwI4QHXwBU="}]},"maintainers":[{"name":"atomist","email":"npm@atomist.com"}],"_npmUser":{"name":"atomist","email":"npm@atomist.com"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/org-visualizer_1.0.0-fp-workspace-migration.20191105214915_1572990715020_0.8342025978350331"},"_hasShrinkwrap":false}},"time":{"created":"2019-05-07T01:02:37.862Z","0.1.1-master.20190507010025":"2019-05-07T01:02:38.077Z","modified":"2023-02-23T17:59:22.136Z","0.1.1-master.20190507011759":"2019-05-07T01:19:34.699Z","0.1.1":"2019-05-07T01:26:47.887Z","0.1.2-master.20190507013759":"2019-05-07T01:40:14.191Z","0.1.2":"2019-05-07T01:46:00.802Z","0.1.3-master.20190507020634":"2019-05-07T02:08:03.371Z","0.1.3":"2019-05-07T02:12:58.284Z","0.1.4-master.20190507180331":"2019-05-07T18:05:11.221Z","0.1.4-master.20190507215104":"2019-05-07T21:53:10.317Z","0.1.4-scatter.20190507224029":"2019-05-07T22:42:00.535Z","0.1.4-scatter.20190508003948":"2019-05-08T00:41:34.661Z","0.1.4-master.20190508180155":"2019-05-08T18:04:04.804Z","0.1.4-master.20190508233931":"2019-05-08T23:41:14.440Z","0.1.4-mono.20190511023532":"2019-05-11T02:38:22.073Z","0.1.4-mono.20190511024018":"2019-05-11T02:41:32.299Z","0.1.4-mono.20190511024903":"2019-05-11T02:50:15.513Z","0.1.4-mono.20190511214810":"2019-05-11T21:50:37.845Z","0.1.4-mono.20190511221327":"2019-05-11T22:14:49.599Z","0.1.4-mono.20190511221529":"2019-05-11T22:16:58.933Z","0.1.4-mono.20190511222048":"2019-05-11T22:22:07.766Z","0.1.4-mono.20190511222655":"2019-05-11T22:28:18.690Z","0.1.4-mono.20190511222932":"2019-05-11T22:31:05.008Z","0.1.4-mono.20190511224108":"2019-05-11T22:42:36.818Z","0.1.4-mono.20190511225400":"2019-05-11T22:55:34.287Z","0.1.4-mono.20190511225417":"2019-05-11T22:55:48.682Z","0.1.4-mono.20190511225958":"2019-05-11T23:01:27.955Z","0.1.4-mono.20190511231600":"2019-05-11T23:17:35.065Z","0.1.4-mono.20190511233102":"2019-05-11T23:32:32.357Z","0.1.4-mono.20190511235432":"2019-05-11T23:55:55.594Z","0.1.4-mono.20190512031404":"2019-05-12T03:15:36.491Z","0.1.4-mono.20190513192148":"2019-05-13T19:24:36.523Z","0.1.4-mono.20190513210618":"2019-05-13T21:07:54.706Z","0.1.4-mono.20190513212706":"2019-05-13T21:29:44.961Z","0.1.4-mono.20190513235008":"2019-05-13T23:51:42.044Z","0.1.4-mono.20190514000347":"2019-05-14T00:05:18.839Z","0.1.4-mono.20190514000744":"2019-05-14T00:10:33.487Z","0.1.4-mono.20190514001110":"2019-05-14T00:13:49.088Z","0.1.4-mono.20190514001113":"2019-05-14T00:14:27.777Z","0.1.4-mono.20190514001418":"2019-05-14T00:15:55.669Z","0.1.4-mono.20190514004731":"2019-05-14T00:48:59.398Z","0.1.4-mono.20190514014016":"2019-05-14T01:41:43.024Z","0.1.4-master.20190514172051":"2019-05-14T17:22:17.249Z","0.1.4-master.20190514230304":"2019-05-14T23:05:19.115Z","0.1.4-proj-page.20190516010106":"2019-05-16T01:02:45.693Z","0.1.4-master.20190517112202":"2019-05-17T11:25:38.148Z","0.1.4-proj-page.20190517173455":"2019-05-17T17:36:42.452Z","0.1.4-proj-page.20190517212900":"2019-05-17T21:31:27.462Z","0.1.4-proj-page.20190518015632":"2019-05-18T01:58:55.811Z","0.1.4-proj-page.20190518174329":"2019-05-18T17:45:51.445Z","0.1.4-proj-page2.20190518230955":"2019-05-18T23:11:18.956Z","0.1.4-proj-page2.20190519001544":"2019-05-19T00:17:53.575Z","0.1.4-proj-page2.20190519022525":"2019-05-19T02:26:46.422Z","0.1.4-proj-page2.20190519202037":"2019-05-19T20:21:59.856Z","0.1.4-proj-page2.20190519210538":"2019-05-19T21:07:07.507Z","0.1.4-proj-page2.20190519214640":"2019-05-19T21:48:00.615Z","0.1.4-proj-page2.20190519233629":"2019-05-19T23:38:18.160Z","0.1.4-proj-page2.20190520215605":"2019-05-20T21:58:35.917Z","0.1.4-proj-page2.20190520215650":"2019-05-20T21:59:02.417Z","0.1.4-proj-page2.20190520220106":"2019-05-20T22:03:17.020Z","0.1.4-proj-page2.20190520220437":"2019-05-20T22:06:15.210Z","0.1.4-proj-page2.20190520221148":"2019-05-20T22:13:07.990Z","0.1.4-proj-page2.20190520223949":"2019-05-20T22:41:46.297Z","0.1.4-proj-page2.20190520232239":"2019-05-20T23:24:04.336Z","0.1.4-proj-page2.20190520234613":"2019-05-20T23:47:36.364Z","0.1.4-proj-page2.20190521200823":"2019-05-21T20:10:36.498Z","0.1.4-proj-page2.20190521203057":"2019-05-21T20:33:05.262Z","0.1.4-proj-page2.20190521203823":"2019-05-21T20:40:07.275Z","0.1.4-nortissej.jess-aggr.20190521205806":"2019-05-21T20:59:43.726Z","0.1.4-proj-page2.20190521231535":"2019-05-21T23:17:53.214Z","0.1.4-proj-page2.20190522220119":"2019-05-22T22:03:46.042Z","0.1.4-proj-page2.20190523024331":"2019-05-23T02:45:17.509Z","0.1.4-up-master.20190523232226":"2019-05-23T23:24:48.885Z","0.1.4-up-master.20190523232654":"2019-05-23T23:28:54.971Z","0.1.4-up-master.20190524010109":"2019-05-24T01:02:45.275Z","0.1.4-up-master.20190524163956":"2019-05-24T16:41:35.646Z","0.1.4-up-master.20190524164459":"2019-05-24T16:46:39.716Z","0.1.4-up-master.20190524170605":"2019-05-24T17:07:58.376Z","0.1.4-up-master.20190524175855":"2019-05-24T18:00:32.140Z","0.1.4-up-master.20190524183334":"2019-05-24T18:35:07.494Z","0.1.4-up-master.20190525174935":"2019-05-25T17:51:46.446Z","0.1.4-up-master.20190525190013":"2019-05-25T19:01:41.904Z","0.1.4-up-master.20190525190634":"2019-05-25T19:08:07.415Z","0.1.4-up-master.20190527012117":"2019-05-27T01:23:54.183Z","0.1.4-master.20190527191546":"2019-05-27T19:17:56.186Z","0.1.4-master.20190527223944":"2019-05-27T22:41:56.915Z","0.1.4-master.20190527224915":"2019-05-27T22:51:10.377Z","0.1.4-master.20190527232606":"2019-05-27T23:27:32.989Z","0.1.4-master.20190528192338":"2019-05-28T19:25:37.111Z","0.1.4-master.20190528200132":"2019-05-28T20:03:31.448Z","0.1.4-master.20190528234533":"2019-05-28T23:47:15.658Z","0.1.4-master.20190529001507":"2019-05-29T00:17:05.619Z","0.1.4-master.20190529005259":"2019-05-29T00:54:58.841Z","0.1.4-master.20190530065329":"2019-05-30T06:57:23.786Z","0.1.4-master.20190530071209":"2019-05-30T07:14:01.715Z","0.1.4-master.20190530082559":"2019-05-30T08:29:10.919Z","0.1.4-master.20190530084918":"2019-05-30T08:51:14.799Z","0.1.4-master.20190531104250":"2019-05-31T10:45:26.997Z","0.1.4-master.20190601062850":"2019-06-01T06:30:27.564Z","0.1.4-master.20190601064115":"2019-06-01T06:43:13.337Z","0.1.4-master.20190601075952":"2019-06-01T08:02:45.916Z","0.1.4-master.20190603083127":"2019-06-03T08:34:02.493Z","0.1.4-master.20190603234122":"2019-06-03T23:44:31.977Z","0.1.4-api.20190604101245":"2019-06-04T10:17:38.115Z","0.1.4-master.20190604105716":"2019-06-04T11:00:14.687Z","0.1.4-master.20190605031048":"2019-06-05T03:13:23.969Z","0.1.4-sql.20190605072229":"2019-06-05T07:25:08.750Z","0.1.4-sql.20190605123040":"2019-06-05T12:32:42.172Z","0.1.4-sql.20190606005028":"2019-06-06T00:52:38.861Z","0.1.4-sql.20190606080832":"2019-06-06T08:10:22.462Z","0.1.4-sql.20190607073409":"2019-06-07T07:38:18.362Z","0.1.4-sql2.20190608035910":"2019-06-08T04:01:10.414Z","0.1.4-master.20190608091239":"2019-06-08T09:14:37.225Z","0.1.4-master.20190611003832":"2019-06-11T00:41:58.198Z","0.1.4-master.20190611075648":"2019-06-11T07:58:32.673Z","0.1.4-master.20190611082439":"2019-06-11T08:26:36.524Z","0.1.4-master.20190612044708":"2019-06-12T04:50:23.487Z","0.1.4-master.20190612060332":"2019-06-12T06:06:06.346Z","0.1.4-master.20190612082450":"2019-06-12T08:28:58.422Z","0.1.4-master.20190612083842":"2019-06-12T08:42:25.944Z","0.1.4-master.20190612105714":"2019-06-12T11:00:46.513Z","0.1.4-master.20190613033822":"2019-06-13T03:41:20.331Z","0.1.4-master.20190613065233":"2019-06-13T06:54:57.024Z","0.1.4-master.20190613084625":"2019-06-13T08:48:49.817Z","0.1.4-master.20190613085454":"2019-06-13T08:56:51.870Z","0.1.4-master.20190613090633":"2019-06-13T09:09:15.217Z","0.1.4-master.20190613091446":"2019-06-13T09:19:16.183Z","0.1.4-master.20190613092723":"2019-06-13T09:29:30.683Z","0.1.4-master.20190613094251":"2019-06-13T09:44:53.101Z","0.1.4-master.20190613105852":"2019-06-13T11:00:48.675Z","0.1.4":"2019-06-13T11:46:54.122Z","0.1.5-master.20190613115636":"2019-06-13T11:58:31.275Z","0.1.5":"2019-06-13T12:09:41.954Z","0.1.6-master.20190613121716":"2019-06-13T12:19:14.251Z","0.1.6":"2019-06-13T12:22:59.414Z","0.1.7-master.20190613123029":"2019-06-13T12:32:25.439Z","0.1.7":"2019-06-13T12:44:42.010Z","0.1.8-master.20190613155241":"2019-06-13T15:54:25.151Z","0.1.8":"2019-06-13T15:56:41.042Z","0.1.9-master.20190613163449":"2019-06-13T16:37:13.992Z","0.1.9-master.20190613165012":"2019-06-13T16:52:31.890Z","0.1.9-master.20190613170148":"2019-06-13T17:04:01.872Z","0.1.9-master.20190613170952":"2019-06-13T17:12:13.055Z","0.1.9":"2019-06-13T17:15:34.740Z","0.1.10-master.20190614002117":"2019-06-14T00:23:20.781Z","0.1.10-master.20190614015128":"2019-06-14T01:53:29.423Z","0.1.10-master.20190614022830":"2019-06-14T02:30:13.687Z","0.1.10-master.20190615071148":"2019-06-15T07:13:51.705Z","0.1.10-master.20190616084029":"2019-06-16T08:42:31.829Z","0.1.10-master.20190617163157":"2019-06-17T16:34:48.939Z","0.1.10-master.20190617191632":"2019-06-17T19:19:10.216Z","0.1.10-master.20190617195826":"2019-06-17T20:01:23.090Z","0.1.10-master.20190617203105":"2019-06-17T20:32:54.008Z","0.1.10":"2019-06-17T20:50:01.467Z","0.1.11-master.20190620120844":"2019-06-20T12:10:50.280Z","0.1.11-master.20190620153201":"2019-06-20T15:34:35.980Z","0.1.11-master.20190620182744":"2019-06-20T18:31:15.252Z","0.1.11-master.20190620185348":"2019-06-20T18:58:26.110Z","0.1.11-master.20190620195138":"2019-06-20T19:53:31.187Z","0.1.11-master.20190620203247":"2019-06-20T20:35:55.044Z","0.1.11-master.20190620211746":"2019-06-20T21:19:59.875Z","0.1.11-nortissej.local-spider.20190621012259":"2019-06-21T01:24:47.612Z","0.1.11-master.20190621124846":"2019-06-21T12:50:50.872Z","0.1.11-master.20190621185235":"2019-06-21T18:56:54.391Z","0.1.11-master.20190621205148":"2019-06-21T20:54:16.279Z","0.1.11-master.20190621205244":"2019-06-21T20:56:31.378Z","0.1.11-master.20190622185230":"2019-06-22T18:54:47.934Z","0.1.11-python.20190622222443":"2019-06-22T22:30:44.423Z","0.1.11-master.20190622231229":"2019-06-22T23:17:04.166Z","0.1.11-python.20190623222434":"2019-06-23T22:26:28.009Z","0.1.11-master.20190624120821":"2019-06-24T12:11:46.590Z","0.1.11-master.20190624145917":"2019-06-24T15:01:57.736Z","0.1.11-master.20190624155848":"2019-06-24T16:00:20.184Z","0.1.11-python.20190624181357":"2019-06-24T18:15:40.048Z","0.1.11-python.20190624184710":"2019-06-24T18:49:04.887Z","0.1.11-master.20190624185934":"2019-06-24T19:01:51.151Z","0.1.11-master.20190624190500":"2019-06-24T19:06:49.978Z","0.1.11-master.20190624210200":"2019-06-24T21:05:38.127Z","0.1.11-master.20190626224014":"2019-06-26T22:42:01.130Z","0.1.11-master.20190628004255":"2019-06-28T00:45:07.113Z","0.1.11-master.20190701031259":"2019-07-01T03:15:20.041Z","0.1.11-master.20190701133012":"2019-07-01T13:32:20.418Z","0.1.11":"2019-07-01T13:42:56.559Z","0.1.12-master.20190701145012":"2019-07-01T14:52:50.034Z","0.1.12":"2019-07-01T15:37:05.875Z","0.1.13-master.20190701172032":"2019-07-01T17:22:28.676Z","0.1.13-master.20190701220948":"2019-07-01T22:13:01.881Z","0.1.13-master.20190702003322":"2019-07-02T00:35:45.999Z","0.1.13-master.20190702055743":"2019-07-02T06:00:09.077Z","0.1.13-master.20190702064320":"2019-07-02T06:45:47.518Z","0.1.13-master.20190702121150":"2019-07-02T12:13:45.158Z","0.1.13-master.20190702164912":"2019-07-02T16:51:03.525Z","0.1.13-master.20190702171433":"2019-07-02T17:16:29.793Z","0.1.13-master.20190702172557":"2019-07-02T17:27:49.901Z","0.1.13-master.20190703072940":"2019-07-03T07:33:07.312Z","0.1.13-master.20190703074234":"2019-07-03T07:44:29.732Z","0.1.13-master.20190703132136":"2019-07-03T13:23:13.166Z","0.1.13-master.20190703171611":"2019-07-03T17:18:37.541Z","0.1.13-master.20190703180737":"2019-07-03T18:10:33.396Z","0.1.13-master.20190703192321":"2019-07-03T19:26:07.082Z","0.1.13-master.20190703202622":"2019-07-03T20:28:16.587Z","0.1.13-master.20190703215610":"2019-07-03T21:59:13.181Z","0.1.13-master.20190703230724":"2019-07-03T23:09:25.524Z","0.1.13-master.20190703235753":"2019-07-04T00:02:36.203Z","0.1.13-master.20190704003331":"2019-07-04T00:35:50.471Z","0.1.13-master.20190704010204":"2019-07-04T01:04:16.858Z","0.1.13-master.20190704014407":"2019-07-04T01:46:15.472Z","0.1.13-master.20190704014548":"2019-07-04T01:48:03.120Z","0.1.13-master.20190704015636":"2019-07-04T01:58:23.595Z","0.1.13-master.20190704070635":"2019-07-04T07:10:07.820Z","0.1.13-noselector.20190704071010":"2019-07-04T07:11:56.683Z","0.1.13":"2019-07-04T07:19:14.365Z","0.1.13-noselector.20190704075322":"2019-07-04T07:55:26.149Z","0.1.14-master.20190704105607":"2019-07-04T10:58:02.592Z","0.1.14":"2019-07-04T11:02:02.038Z","0.1.15-master.20190704121806":"2019-07-04T12:21:29.029Z","0.1.15":"2019-07-04T12:44:44.534Z","0.1.16-master.20190704193642":"2019-07-04T19:38:33.547Z","0.1.16-master.20190704193725":"2019-07-04T19:39:25.971Z","0.1.16-master.20190704195009":"2019-07-04T19:54:40.827Z","0.1.16-master.20190704195442":"2019-07-04T19:57:27.386Z","0.1.16-master.20190705081207":"2019-07-05T08:16:04.049Z","0.1.16-master.20190705081512":"2019-07-05T08:17:12.245Z","0.1.16-master.20190705092155":"2019-07-05T09:25:08.264Z","0.1.16-master.20190705093112":"2019-07-05T09:32:55.780Z","0.1.16":"2019-07-05T09:51:40.848Z","0.1.17-master.20190705225954":"2019-07-05T23:02:37.363Z","0.1.17-master.20190706090217":"2019-07-06T09:04:08.730Z","0.1.17-master.20190707001309":"2019-07-07T00:15:24.396Z","0.1.17-master.20190707001647":"2019-07-07T00:18:49.746Z","0.1.17-master.20190707003107":"2019-07-07T00:32:58.747Z","0.1.17-master.20190708024751":"2019-07-08T02:49:57.299Z","0.1.17-master.20190708025012":"2019-07-08T02:52:52.992Z","0.1.17-master.20190708081139":"2019-07-08T08:17:28.397Z","0.1.17-master.20190708082508":"2019-07-08T08:27:43.933Z","0.1.17-master.20190708085015":"2019-07-08T08:52:40.407Z","0.1.17-master.20190708090702":"2019-07-08T09:09:04.608Z","0.1.17-master.20190708091542":"2019-07-08T09:19:08.052Z","0.1.17-master.20190708155815":"2019-07-08T16:00:04.414Z","0.1.17-master.20190708161641":"2019-07-08T16:18:43.198Z","0.1.17":"2019-07-08T16:23:54.543Z","0.1.18-master.20190708163252":"2019-07-08T16:35:47.413Z","0.1.18":"2019-07-08T16:40:24.642Z","0.1.19-master.20190708212315":"2019-07-08T21:28:55.672Z","0.1.19-master.20190708213709":"2019-07-08T21:39:23.222Z","0.1.19-master.20190708215724":"2019-07-08T22:01:10.392Z","0.1.19-master.20190709013908":"2019-07-09T01:43:32.961Z","0.1.19-master.20190709022742":"2019-07-09T02:30:03.967Z","0.1.19-master.20190709050336":"2019-07-09T05:07:05.017Z","0.1.19":"2019-07-09T06:36:00.513Z","0.1.20-master.20190709194541":"2019-07-09T19:47:32.608Z","0.1.20-master.20190709230722":"2019-07-09T23:11:33.259Z","0.1.20-master.20190709231959":"2019-07-09T23:21:46.050Z","0.1.20-nortissej.documentation-url.20190709235454":"2019-07-09T23:56:41.158Z","0.1.20-master.20190710002824":"2019-07-10T00:30:12.955Z","0.1.20-master.20190710011704":"2019-07-10T01:20:10.638Z","0.1.20-master.20190710053054":"2019-07-10T05:33:29.219Z","0.1.20-master.20190710061316":"2019-07-10T06:15:07.562Z","0.1.20-master.20190710075106":"2019-07-10T07:54:41.866Z","0.1.20-entropy.20190710080106":"2019-07-10T08:03:16.823Z","0.1.20-entropy.20190710080451":"2019-07-10T08:07:03.924Z","0.1.20-master.20190710113118":"2019-07-10T11:32:58.301Z","0.1.20-master.20190710115808":"2019-07-10T12:00:16.224Z","0.1.20-entropy.20190710224424":"2019-07-10T22:48:21.639Z","0.1.20-master.20190710230428":"2019-07-10T23:07:25.496Z","0.1.20-entropy.20190710235320":"2019-07-10T23:55:13.399Z","0.1.20-entropy.20190711000135":"2019-07-11T00:03:29.296Z","0.1.20-entropy.20190711030959":"2019-07-11T03:13:37.268Z","0.1.20-master.20190711064510":"2019-07-11T06:46:59.486Z","0.1.20-master.20190711070314":"2019-07-11T07:05:03.156Z","0.1.20-master.20190711071345":"2019-07-11T07:15:36.210Z","0.1.20-master.20190711080253":"2019-07-11T08:05:21.356Z","0.1.20-master.20190711104845":"2019-07-11T10:51:32.769Z","0.1.20-master.20190711203158":"2019-07-11T20:35:23.232Z","0.1.20-master.20190711205804":"2019-07-11T20:59:55.933Z","0.1.20-master.20190711211457":"2019-07-11T21:16:42.764Z","0.1.20-master.20190712013513":"2019-07-12T01:37:43.560Z","0.1.20-master.20190712055626":"2019-07-12T05:58:42.237Z","0.1.20-master.20190712073911":"2019-07-12T07:40:44.394Z","0.1.20-master.20190712080607":"2019-07-12T08:08:43.767Z","0.1.20-master.20190712133258":"2019-07-12T13:34:47.999Z","0.1.20-master.20190712151650":"2019-07-12T15:20:25.623Z","0.1.20-master.20190712165139":"2019-07-12T16:54:23.146Z","0.1.20-master.20190713014634":"2019-07-13T01:48:20.189Z","0.1.20-master.20190713022448":"2019-07-13T02:27:46.045Z","0.1.20-trees.20190714102208":"2019-07-14T10:25:24.860Z","0.1.20-master.20190714102516":"2019-07-14T10:27:14.849Z","0.1.20-tree2.20190715030856":"2019-07-15T03:10:41.958Z","0.1.20-tree2.20190715032953":"2019-07-15T03:32:44.824Z","0.1.20-tree2.20190715042200":"2019-07-15T04:24:27.666Z","0.1.20-tree2.20190715043542":"2019-07-15T04:37:23.771Z","0.1.20-master.20190715043809":"2019-07-15T04:39:49.932Z","0.1.20-master.20190715044400":"2019-07-15T04:45:54.737Z","0.1.20-master.20190715045938":"2019-07-15T05:01:22.326Z","0.1.20-master.20190715202442":"2019-07-15T20:27:01.386Z","0.1.20-master.20190715224047":"2019-07-15T22:43:28.092Z","0.1.20-master.20190715225500":"2019-07-15T22:57:56.580Z","0.1.20-master.20190715225713":"2019-07-15T23:00:01.672Z","0.1.20-master.20190716004125":"2019-07-16T00:45:42.638Z","0.1.20-master.20190716012509":"2019-07-16T01:27:56.894Z","0.1.20-nortissej.metadata.20190716032548":"2019-07-16T03:28:45.151Z","0.1.20-master.20190716062531":"2019-07-16T06:29:41.673Z","0.1.20-master.20190716071904":"2019-07-16T07:23:23.969Z","0.1.20-master.20190716072725":"2019-07-16T07:30:01.720Z","0.1.20-master.20190716080223":"2019-07-16T08:07:17.635Z","0.1.20-master.20190716080831":"2019-07-16T08:11:14.980Z","0.1.20-master.20190716082153":"2019-07-16T08:24:11.390Z","0.1.20-master.20190716092339":"2019-07-16T09:25:47.644Z","0.1.20-master.20190716102619":"2019-07-16T10:29:50.724Z","0.1.20-nortissej.metadata.20190716220139":"2019-07-16T22:04:24.418Z","0.1.20-master.20190717011604":"2019-07-17T01:19:22.604Z","0.1.20-master.20190717024806":"2019-07-17T02:50:16.482Z","0.1.20":"2019-07-17T08:36:47.973Z","0.1.21-master.20190717132024":"2019-07-17T13:23:41.415Z","0.1.21-master.20190717133706":"2019-07-17T13:39:52.678Z","0.1.21-branches.20190718052005":"2019-07-18T05:25:34.467Z","0.1.21-branches.20190718053443":"2019-07-18T05:39:52.338Z","0.1.21-master.20190718104920":"2019-07-18T10:53:45.621Z","0.1.21-master.20190718111730":"2019-07-18T11:21:00.524Z","0.1.21-branches.20190719004355":"2019-07-19T00:47:44.365Z","0.1.21-master.20190719005115":"2019-07-19T00:54:49.987Z","0.1.21-master.20190719010150":"2019-07-19T01:05:47.476Z","0.1.21-master.20190719012332":"2019-07-19T01:27:27.811Z","0.1.21-branch-heads.20190720000338":"2019-07-20T00:09:30.476Z","0.1.21-swagger.20190721004534":"2019-07-21T00:50:21.203Z","0.1.21-swagger.20190721085023":"2019-07-21T08:55:50.882Z","0.1.21-swagger.20190721232910":"2019-07-21T23:34:43.653Z","0.1.21-master.20190722064327":"2019-07-22T06:48:39.356Z","0.1.21-master.20190722185433":"2019-07-22T19:00:22.080Z","0.1.21-master.20190722221046":"2019-07-22T22:15:08.625Z","0.1.21-master.20190722221524":"2019-07-22T22:21:54.546Z","0.1.21-master.20190722222708":"2019-07-22T22:30:17.871Z","0.1.21-master.20190722223108":"2019-07-22T22:35:59.341Z","0.1.21-master.20190722223517":"2019-07-22T22:40:30.202Z","0.1.21-master.20190722233555":"2019-07-22T23:41:52.168Z","0.1.21-master.20190723041041":"2019-07-23T04:14:40.221Z","0.1.21-master.20190723073645":"2019-07-23T07:41:21.248Z","0.1.21-master.20190723121028":"2019-07-23T12:16:05.626Z","0.1.21-master.20190723122423":"2019-07-23T12:28:27.024Z","0.1.21-master.20190723155434":"2019-07-23T16:00:46.317Z","0.1.21-master.20190723190848":"2019-07-23T19:13:36.859Z","0.1.21-master.20190723195958":"2019-07-23T20:04:05.610Z","0.1.21-master.20190724011553":"2019-07-24T01:19:20.915Z","0.1.21-master.20190724054857":"2019-07-24T05:52:00.805Z","0.1.21-master.20190724065917":"2019-07-24T07:02:24.358Z","0.1.21-master.20190724080628":"2019-07-24T08:09:59.755Z","0.1.21-master.20190724120402":"2019-07-24T12:08:51.365Z","0.1.21-master.20190724121609":"2019-07-24T12:20:27.284Z","0.1.21-master.20190724121729":"2019-07-24T12:20:59.631Z","0.1.21-master.20190724181240":"2019-07-24T18:15:16.697Z","0.1.21-master.20190725002401":"2019-07-25T00:27:51.960Z","0.1.21-master.20190725031421":"2019-07-25T03:17:29.772Z","0.1.21-master.20190725044358":"2019-07-25T04:48:28.916Z","0.1.21-master.20190725075334":"2019-07-25T07:57:13.663Z","0.1.21-master.20190725205420":"2019-07-25T20:57:17.871Z","0.1.21-master.20190725211152":"2019-07-25T21:15:34.920Z","0.1.21-hover.20190725233131":"2019-07-25T23:35:14.855Z","0.1.21-master.20190726020848":"2019-07-26T02:12:49.869Z","0.1.21-master.20190726021806":"2019-07-26T02:25:01.435Z","0.1.21-hover.20190726040130":"2019-07-26T04:04:33.747Z","0.1.21-hover.20190726040721":"2019-07-26T04:11:55.293Z","0.1.21-master.20190726064056":"2019-07-26T06:44:55.702Z","0.1.21-master.20190726072234":"2019-07-26T07:27:33.612Z","0.1.21-master.20190726082718":"2019-07-26T08:33:18.630Z","0.1.21-master.20190726083019":"2019-07-26T08:33:36.640Z","0.1.21-master.20190726083425":"2019-07-26T08:38:35.390Z","0.1.21":"2019-07-26T18:09:56.144Z","0.1.22-hover.20190726204148":"2019-07-26T20:47:23.800Z","0.1.22-master.20190726211010":"2019-07-26T21:14:20.285Z","0.1.22-master.20190726214031":"2019-07-26T21:45:25.572Z","0.1.22-hover.20190726220021":"2019-07-26T22:04:20.923Z","0.1.22-master.20190726220435":"2019-07-26T22:07:35.365Z","0.1.22-master.20190727000945":"2019-07-27T00:14:48.641Z","0.1.22-master.20190727004157":"2019-07-27T00:45:56.764Z","0.1.22-master.20190727070328":"2019-07-27T07:08:59.369Z","0.1.22-master.20190727080323":"2019-07-27T08:08:31.669Z","0.1.22-master.20190727081757":"2019-07-27T08:23:16.713Z","0.1.22-master.20190727084956":"2019-07-27T08:55:46.388Z","0.1.22-master.20190727114412":"2019-07-27T11:47:05.101Z","0.1.22-master.20190727232909":"2019-07-27T23:34:50.490Z","0.1.22-master.20190728002738":"2019-07-28T00:33:19.992Z","0.1.22-master.20190728034709":"2019-07-28T03:52:47.479Z","0.1.22-master.20190728065307":"2019-07-28T06:59:01.501Z","0.1.22-master.20190728074838":"2019-07-28T07:54:37.257Z","0.1.22-master.20190728144049":"2019-07-28T14:46:34.416Z","0.1.22-master.20190728211036":"2019-07-28T21:16:50.325Z","0.1.22-master.20190728215811":"2019-07-28T22:04:15.964Z","0.1.22-master.20190728220936":"2019-07-28T22:15:34.143Z","0.1.22-master.20190728221441":"2019-07-28T22:20:34.868Z","0.1.22-master.20190728223658":"2019-07-28T22:43:16.497Z","0.1.22-master.20190728233446":"2019-07-28T23:40:36.389Z","0.1.22-master.20190729085555":"2019-07-29T09:01:56.050Z","0.1.22-master.20190729091410":"2019-07-29T09:20:15.178Z","0.1.22-master.20190729190730":"2019-07-29T19:10:41.839Z","0.1.22-master.20190729202621":"2019-07-29T20:29:49.179Z","0.1.22-master.20190729204609":"2019-07-29T20:49:14.744Z","0.1.22-master.20190729214253":"2019-07-29T21:46:42.027Z","0.1.22-master.20190730011248":"2019-07-30T01:18:19.012Z","0.1.22-master.20190730012736":"2019-07-30T01:33:08.718Z","0.1.22-master.20190730090510":"2019-07-30T09:08:51.523Z","0.1.22-master.20190730092009":"2019-07-30T09:25:18.064Z","0.1.22-master.20190730095030":"2019-07-30T09:55:56.207Z","0.1.22-master.20190730102641":"2019-07-30T10:31:49.854Z","0.1.22-master.20190730113657":"2019-07-30T11:41:56.478Z","0.1.22-master.20190730185440":"2019-07-30T18:58:19.125Z","0.1.22-master.20190730220152":"2019-07-30T22:05:23.302Z","0.1.22-band.20190730231546":"2019-07-30T23:20:01.832Z","0.1.22-master.20190730231838":"2019-07-30T23:21:55.115Z","0.1.22-master.20190730234632":"2019-07-30T23:50:46.208Z","0.1.22-master.20190730235752":"2019-07-31T00:02:28.344Z","0.1.22-master.20190730235852":"2019-07-31T00:02:46.159Z","0.1.22-master.20190731000451":"2019-07-31T00:09:03.344Z","0.1.22-master.20190731064609":"2019-07-31T06:50:06.316Z","0.1.22-slim-190730.20190731064839":"2019-07-31T06:53:05.650Z","0.1.22-master.20190731072510":"2019-07-31T07:28:23.673Z","0.1.22-master.20190731073615":"2019-07-31T07:40:21.961Z","0.1.22-master.20190731112831":"2019-07-31T11:32:29.240Z","0.1.22-master.20190731131327":"2019-07-31T13:16:41.195Z","0.1.22-master.20190731133737":"2019-07-31T13:43:02.051Z","0.1.22-master.20190731135349":"2019-07-31T13:59:06.099Z","0.1.22-master.20190731165319":"2019-07-31T16:57:14.387Z","0.1.22-master.20190731213111":"2019-07-31T21:36:32.458Z","0.1.22-master.20190731224346":"2019-07-31T22:48:47.750Z","0.1.22-master.20190801064946":"2019-08-01T06:53:13.349Z","0.1.22-master.20190801072830":"2019-08-01T07:32:13.273Z","0.1.22-master.20190801073509":"2019-08-01T07:38:12.663Z","0.1.22-master.20190801091819":"2019-08-01T09:22:32.145Z","0.1.22":"2019-08-01T10:06:29.217Z","0.1.22-explorer.20190801104541":"2019-08-01T10:48:54.309Z","0.1.23-master.20190801105501":"2019-08-01T10:58:27.062Z","0.1.23-master.20190801112639":"2019-08-01T11:30:36.150Z","0.1.23":"2019-08-01T12:06:01.209Z","0.1.24-master.20190801162606":"2019-08-01T16:32:30.465Z","0.1.24":"2019-08-01T17:12:19.243Z","0.1.25-master.20190801195908":"2019-08-01T20:03:20.786Z","0.1.25-master.20190801202233":"2019-08-01T20:28:54.148Z","0.1.25":"2019-08-01T20:37:25.363Z","0.1.22-explorer.20190802071735":"2019-08-02T07:23:00.838Z","0.1.26-master.20190802095252":"2019-08-02T09:59:30.239Z","0.1.26-master.20190802102306":"2019-08-02T10:28:28.069Z","0.1.26":"2019-08-02T12:22:39.991Z","0.1.27-master.20190802180748":"2019-08-02T18:11:38.234Z","0.1.27":"2019-08-02T18:18:56.210Z","0.1.27-master.20190802180546":"2019-08-02T18:46:57.306Z","0.1.28-master.20190802190707":"2019-08-02T19:11:15.813Z","0.1.28-master.20190802220432":"2019-08-02T22:11:17.093Z","0.1.28":"2019-08-02T22:24:09.681Z","0.1.29-explorer.20190802225521":"2019-08-02T23:01:59.226Z","0.1.29-explorer.20190803004507":"2019-08-03T00:53:38.999Z","0.1.29-master.20190803090726":"2019-08-03T09:15:06.295Z","0.1.29-master.20190803130000":"2019-08-03T13:08:38.403Z","0.1.29-master.20190803152008":"2019-08-03T15:23:41.216Z","0.1.29-master.20190803230732":"2019-08-03T23:13:23.547Z","0.1.29-explore-ui.20190804013840":"2019-08-04T01:44:42.912Z","0.1.29-master.20190804094502":"2019-08-04T09:51:37.757Z","0.1.29-master.20190804095736":"2019-08-04T10:03:13.354Z","0.1.29-explore-ui.20190804185527":"2019-08-04T19:01:05.587Z","0.1.29-explore-ui.20190804190600":"2019-08-04T19:11:36.886Z","0.1.29-master.20190804222013":"2019-08-04T22:24:11.079Z","0.1.29-master.20190805035234":"2019-08-05T03:57:55.375Z","0.1.29-master.20190805041448":"2019-08-05T04:20:47.412Z","0.1.29-master.20190805063256":"2019-08-05T06:38:09.304Z","0.1.29-master.20190806042350":"2019-08-06T04:30:09.288Z","0.1.29-master.20190806043048":"2019-08-06T04:36:31.315Z","0.1.29-master.20190806055528":"2019-08-06T06:00:12.046Z","0.1.29-master.20190806070238":"2019-08-06T07:05:46.196Z","0.1.29-master.20190806072705":"2019-08-06T07:33:22.582Z","0.1.29-master.20190806081825":"2019-08-06T08:22:33.896Z","0.1.29-master.20190806083912":"2019-08-06T08:43:41.012Z","0.1.29-master.20190806085346":"2019-08-06T08:58:07.036Z","0.1.29-master.20190806090208":"2019-08-06T09:08:08.801Z","0.1.29-master.20190806091546":"2019-08-06T09:20:25.138Z","0.1.29-master.20190806232010":"2019-08-06T23:26:15.801Z","0.1.29-master.20190807004700":"2019-08-07T00:53:09.175Z","0.1.29-master.20190807025025":"2019-08-07T02:57:09.273Z","0.1.29-master.20190807051056":"2019-08-07T05:17:05.245Z","0.1.29-master.20190807193112":"2019-08-07T19:39:26.642Z","0.1.29-master.20190808082113":"2019-08-08T08:29:40.474Z","0.1.29-multi.20190809025341":"2019-08-09T02:59:10.767Z","0.1.29-multi.20190809044614":"2019-08-09T04:53:31.333Z","0.1.29-multi.20190809050947":"2019-08-09T05:17:08.226Z","0.1.29-multi.20190809052656":"2019-08-09T05:33:08.897Z","0.1.29-multi.20190809075927":"2019-08-09T08:05:41.176Z","0.1.29-multi.20190809105622":"2019-08-09T11:04:17.851Z","0.1.29-k8s-spec.20190809222505":"2019-08-09T22:30:58.842Z","0.1.29-multi.20190810015812":"2019-08-10T02:02:30.116Z","0.1.29-multi.20190810032058":"2019-08-10T03:27:27.789Z","0.1.29-multi.20190810034541":"2019-08-10T03:50:51.058Z","0.1.29-multi.20190810043746":"2019-08-10T04:42:18.138Z","0.1.29-multi.20190810064956":"2019-08-10T06:55:00.975Z","0.1.29-multi.20190810070722":"2019-08-10T07:13:11.950Z","0.1.29-multi.20190810105425":"2019-08-10T11:00:30.641Z","0.1.29-master.20190810163153":"2019-08-10T16:36:49.811Z","0.1.29-multi.20190810231206":"2019-08-10T23:16:51.975Z","0.1.29-multi.20190810232338":"2019-08-10T23:26:52.269Z","0.1.29-multi.20190810233201":"2019-08-10T23:35:40.844Z","0.1.29-multi.20190811035916":"2019-08-11T04:04:14.923Z","0.1.29-multi.20190811052354":"2019-08-11T05:28:54.520Z","0.1.29-multi.20190811095533":"2019-08-11T10:00:38.848Z","0.1.29-multi.20190812080538":"2019-08-12T08:12:26.419Z","0.1.29-master.20190812080859":"2019-08-12T08:14:57.552Z","0.1.29-multi.20190812082722":"2019-08-12T08:33:45.436Z","0.1.29-multi.20190812085505":"2019-08-12T09:00:23.197Z","0.1.29-master.20190812090108":"2019-08-12T09:05:42.854Z","0.1.29-master.20190812100831":"2019-08-12T10:13:01.468Z","0.1.29-k8s-spec.20190812131518":"2019-08-12T13:20:54.447Z","0.1.29-k8s-spec.20190812183011":"2019-08-12T18:36:05.132Z","0.1.29-master.20190812221925":"2019-08-12T22:25:16.279Z","0.1.29-master.20190812225458":"2019-08-12T22:59:14.803Z","0.1.29-master.20190812234612":"2019-08-12T23:53:31.413Z","0.1.29-master.20190813002555":"2019-08-13T00:31:39.323Z","0.1.29-master.20190813002934":"2019-08-13T00:36:19.075Z","0.1.29-master.20190813004327":"2019-08-13T00:49:09.657Z","0.1.29-master.20190813031948":"2019-08-13T03:25:19.818Z","0.1.29-master.20190813063231":"2019-08-13T06:38:12.874Z","0.1.29-master.20190813064749":"2019-08-13T06:51:57.127Z","0.1.29-master.20190813070002":"2019-08-13T07:04:18.567Z","0.1.29-master.20190813080112":"2019-08-13T08:06:59.048Z","0.1.29-master.20190813080856":"2019-08-13T08:16:16.141Z","0.1.29-master.20190813081619":"2019-08-13T08:23:37.896Z","0.1.29-master.20190813112436":"2019-08-13T11:28:29.860Z","0.1.29-master.20190813115206":"2019-08-13T11:59:27.370Z","0.1.29-k8s-spec.20190813172855":"2019-08-13T17:36:29.752Z","0.1.29-master.20190813175211":"2019-08-13T17:58:58.718Z","0.1.29-nortissej.log-at-debug.20190813205405":"2019-08-13T21:03:08.456Z","0.1.29-master.20190813225637":"2019-08-13T23:04:01.671Z","0.1.29-master.20190814025836":"2019-08-14T03:02:45.015Z","0.1.29-master.20190814215730":"2019-08-14T22:07:49.936Z","0.1.29-master.20190814223403":"2019-08-14T22:41:36.803Z","0.1.29-master.20190815001455":"2019-08-15T00:20:47.411Z","0.1.29-master.20190815011616":"2019-08-15T01:20:10.841Z","0.1.29-master.20190815225204":"2019-08-15T22:57:50.393Z","0.1.29-master.20190815233501":"2019-08-15T23:40:48.941Z","0.1.29-master.20190815233757":"2019-08-15T23:42:54.836Z","0.1.29-master.20190816005920":"2019-08-16T01:04:37.922Z","0.1.29-master.20190816014358":"2019-08-16T01:50:17.950Z","0.1.29-master.20190816015004":"2019-08-16T01:56:10.942Z","0.1.29-master.20190816022944":"2019-08-16T02:35:56.811Z","0.1.29-master.20190816030132":"2019-08-16T03:08:25.364Z","0.1.29-master.20190816075854":"2019-08-16T08:04:23.961Z","0.1.29-master.20190816094953":"2019-08-16T09:54:53.740Z","0.1.29-master.20190816105651":"2019-08-16T11:01:57.505Z","0.1.29-spiderCommand.20190816161612":"2019-08-16T16:21:35.283Z","0.1.29-spiderCommand.20190816174708":"2019-08-16T17:52:54.599Z","0.1.29-spiderCommand.20190816184929":"2019-08-16T18:54:40.203Z","0.1.29-spiderCommand.20190817002228":"2019-08-17T00:28:47.718Z","0.1.29-master.20190818023038":"2019-08-18T02:36:56.211Z","0.1.29-master.20190818142211":"2019-08-18T14:28:26.317Z","0.1.29-master.20190818194258":"2019-08-18T19:51:09.844Z","0.1.29-master.20190818200321":"2019-08-18T20:12:05.212Z","0.1.29-master.20190819145346":"2019-08-19T14:57:22.946Z","0.1.29-master.20190819155743":"2019-08-19T16:01:33.694Z","0.1.29-master.20190819210015":"2019-08-19T21:04:06.429Z","0.1.29-master.20190819210851":"2019-08-19T21:12:34.795Z","0.1.29-master.20190820220733":"2019-08-20T22:18:02.757Z","0.1.29-master.20190821000049":"2019-08-21T00:08:58.022Z","0.1.29-master.20190821015907":"2019-08-21T02:08:14.588Z","0.1.29-master.20190821024702":"2019-08-21T02:56:53.428Z","0.1.29-master.20190821062135":"2019-08-21T06:26:39.589Z","0.1.29-master.20190821104121":"2019-08-21T10:44:56.083Z","0.1.29-master.20190821162911":"2019-08-21T16:32:59.548Z","0.1.29-master.20190821164045":"2019-08-21T16:44:11.123Z","0.1.29-master.20190821171345":"2019-08-21T17:18:30.925Z","0.1.29-master.20190821172352":"2019-08-21T17:28:15.929Z","0.1.29-master.20190821181012":"2019-08-21T18:13:46.946Z","0.1.29-master.20190821191911":"2019-08-21T19:24:14.881Z","0.1.29-master.20190821203056":"2019-08-21T20:36:03.273Z","0.1.29-master.20190821223506":"2019-08-21T22:38:30.189Z","0.1.29-master.20190821224029":"2019-08-21T22:45:34.260Z","0.1.29-master.20190821230931":"2019-08-21T23:13:02.815Z","0.1.29-master.20190821231037":"2019-08-21T23:15:31.535Z","0.1.29-master.20190821232139":"2019-08-21T23:26:40.841Z","0.1.29-jess-tsAspect.20190821232816":"2019-08-21T23:31:45.982Z","0.1.29-master.20190821234858":"2019-08-21T23:54:25.793Z","0.1.29-jess-tsAspect.20190822010814":"2019-08-22T01:11:48.178Z","0.1.29-master.20190822012608":"2019-08-22T01:30:26.305Z","0.1.29-master.20190822084137":"2019-08-22T08:45:44.115Z","0.2.0-org-visualizer.20190822112609":"2019-08-22T11:30:19.855Z","0.2.0-org-visualizer.20190822115005":"2019-08-22T11:54:37.256Z","0.2.0-sdm-pack-drift.20190822120156":"2019-08-22T12:05:58.850Z","0.2.0-sdm-pack-drift.20190822121605":"2019-08-22T12:20:27.481Z","1.0.0-sdm-pack-drift.20190822171940":"2019-08-22T17:23:06.627Z","1.0.0-org-visualizer.20190822194108":"2019-08-22T19:47:26.923Z","1.0.0-master.20190822200737":"2019-08-22T20:11:25.152Z","0.1.29-jess-tsAspect.20190822201156":"2019-08-22T20:15:40.472Z","1.0.0-master.20190822201829":"2019-08-22T20:22:20.805Z","0.1.29-master.20190822202714":"2019-08-22T20:31:52.535Z","1.0.0-master.20190822212712":"2019-08-22T21:34:28.874Z","1.0.0-master.20190822213548":"2019-08-22T21:44:46.663Z","1.0.0-master.20190823023521":"2019-08-23T02:45:33.787Z","1.0.0-master.20190823090135":"2019-08-23T09:08:42.067Z","1.0.0-master.20190823104213":"2019-08-23T10:52:37.790Z","1.0.0-master.20190826025636":"2019-08-26T03:07:05.747Z","1.0.0-master.20190826173129":"2019-08-26T17:41:46.800Z","0.1.29-add-node-engine-aspect.20190826204955":"2019-08-26T20:53:38.989Z","0.1.29-add-node-engine-aspect.20190826205831":"2019-08-26T21:02:52.730Z","1.0.0-master.20190826210245":"2019-08-26T21:11:19.386Z","1.0.0-master.20190826220405":"2019-08-26T22:13:46.974Z","1.0.0-master.20190826230830":"2019-08-26T23:21:38.159Z","1.0.0-rj-manual-tag.20190827004235":"2019-08-27T00:47:40.544Z","1.0.0-master.20190827004537":"2019-08-27T00:57:41.133Z","1.0.0-master.20190827171613":"2019-08-27T17:26:00.124Z","1.0.0-master.20190827181459":"2019-08-27T18:26:49.151Z","1.0.0-master.20190827224748":"2019-08-27T22:59:36.524Z","1.0.0-master.20190828005416":"2019-08-28T01:08:02.399Z","1.0.0-master.20190828015514":"2019-08-28T02:07:35.036Z","1.0.0-master.20190828021523":"2019-08-28T02:23:46.580Z","1.0.0-master.20190828121131":"2019-08-28T12:21:11.014Z","1.0.0-atomist.npm-project-deps.master.20190828130100":"2019-08-28T13:05:59.278Z","1.0.0-master.20190828183537":"2019-08-28T18:51:39.531Z","1.0.0-master.20190828190653":"2019-08-28T19:20:58.325Z","1.0.0-master.20190828224526":"2019-08-28T23:04:06.506Z","1.0.0-master.20190830023725":"2019-08-30T02:48:04.799Z","1.0.0-master.20190830234646":"2019-08-31T00:01:35.366Z","1.0.0-master.20190831225506":"2019-08-31T23:10:50.019Z","1.0.0-master.20190903072211":"2019-09-03T07:36:05.898Z","1.0.0-python2or3.20190904201852":"2019-09-04T20:23:58.604Z","1.0.0-python2or3.20190904205215":"2019-09-04T20:56:44.695Z","1.0.0-python2or3.20190904222527":"2019-09-04T22:30:52.525Z","1.0.0-python2or3.20190904223925":"2019-09-04T22:45:07.789Z","1.0.0-python2or3.20190904230128":"2019-09-04T23:05:47.399Z","1.0.0-python2or3.20190904233813":"2019-09-04T23:42:35.695Z","1.0.0-python2or3.20190904234304":"2019-09-04T23:48:22.877Z","1.0.0-python2or3.20190904234150":"2019-09-04T23:49:02.942Z","1.0.0-python2or3.20190904235159":"2019-09-04T23:58:02.059Z","1.0.0-python2or3.20190905000743":"2019-09-05T00:14:20.990Z","1.0.0-python2or3.20190905012141":"2019-09-05T01:28:03.736Z","1.0.0-python2or3.20190905013159":"2019-09-05T01:37:11.820Z","1.0.0-python2or3.20190905141842":"2019-09-05T14:22:49.394Z","1.0.0-python2or3.20190905163419":"2019-09-05T16:38:37.879Z","1.0.0-python2or3.20190905163638":"2019-09-05T16:40:22.618Z","1.0.0-python2or3.20190905201435":"2019-09-05T20:17:41.980Z","1.0.0-python2or3.20190905204635":"2019-09-05T20:51:37.781Z","1.0.0-python2or3.20190905215815":"2019-09-05T22:01:48.363Z","1.0.0-python2or3.20190905221548":"2019-09-05T22:18:58.407Z","1.0.0-python2or3.20190905224738":"2019-09-05T22:51:35.540Z","1.0.0-python2or3.20190905230619":"2019-09-05T23:09:56.241Z","1.0.0-python2or3.20190905231718":"2019-09-05T23:20:39.542Z","1.0.0-python2or3.20190906010516":"2019-09-06T01:15:43.478Z","1.0.0-python2or3.20190906013138":"2019-09-06T01:36:35.894Z","1.0.0-python2or3.20190906055855":"2019-09-06T06:04:40.492Z","1.0.0-atomist.a260p86nh.sdm-deps.master.20190910084552":"2019-09-10T08:51:48.502Z","1.0.0-master.20190910091135":"2019-09-10T09:31:08.453Z","1.0.0-atomist.a260p86nh.typescript-version.master.20190915203730":"2019-09-15T20:40:23.007Z","1.0.0-master.20190916025513":"2019-09-16T03:09:18.329Z","1.0.0-master.20190917181336":"2019-09-17T18:27:42.379Z","1.0.0-master.20190917184940":"2019-09-17T19:03:23.116Z","1.0.0-master.20190930212527":"2019-09-30T21:40:29.877Z","1.0.0-master.20191021162016":"2019-10-21T16:27:45.476Z","1.0.0-fp-workspace-migration.20191105214915":"2019-11-05T21:51:55.212Z"},"maintainers":[{"email":"neil.prosser+npmjs@gmail.com","name":"neilprosser"},{"email":"npm@atomist.com","name":"atomist-bot"},{"email":"cd@atomist.com","name":"cdupuis"},{"email":"slimslenderslacks@gmail.com","name":"slimslenderslacks"}],"description":"Organization Visualizer using Atomist project scanning","homepage":"https://github.com/atomist-blogs/org-visualizer#readme","keywords":["atomist","automation","sdm","seed"],"repository":{"type":"git","url":"git+https://github.com/atomist-blogs/org-visualizer.git"},"author":{"name":"Atomist Inc."},"bugs":{"url":"https://github.com/atomist-blogs/org-visualizer/issues"},"license":"Apache-2.0","readme":"","readmeFilename":""}